Swift/PHP 如何使用 Alamofire 在 UITableView 中显示 mysql 数据 (json)
Swift/PHP How to display mysql data (json) in UITableView using Alamofire
我想创建一个 TableView,其中 return 只有一个单元格。在这个单元格中包含三个标签:id、username 和 category。这将导致让用户看到他的基本详细信息。
当我运行应用程序时,我的UITable视图仍然没有显示任何结果(空白)。
任何人都可以查看我的代码以使其正常工作吗?我看不出哪里错了,因为我在 Xcode
中没有收到任何错误
Table视图控制器
import UIKit
import Alamofire
class MyProfile: UITableViewController {
var users = [MyProfileBasicData]()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
getData()
}
func getData() {
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
var username = prefs.valueForKey("USERNAME") as NSString
Alamofire.request(.GET, "http://mysite/app/data/jsonuser.php", parameters: ["username": username]).responseJSON() { (_, _, data, error) in if let jsonResult = data as? Array<Dictionary<String, String>> {
var UserID = jsonResult [0]["Id"]
var username1 = jsonResult [0]["username"]
var category = jsonResult [0]["category"]
for result in jsonResult {
var userInfo = MyProfileBasicData()
userInfo.Id = jsonResult [0]["Id"]
userInfo.username = jsonResult [0]["username"]
userInfo.category = jsonResult [0]["category"]
self.users.append(userInfo)
}
dispatch_async(dispatch_get_main_queue(),
{ self.tableView.reloadData()
})
println(UserID)
println(username1)
println(category)
}
println(error)
}
func didReceiveMemoryWarning() {
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath:
indexPath) as MyProfileCell
var user = users[indexPath.row]
cell.profileID?.text = user.Id
cell.profileUsername?.text = user.username
cell.profileCategory?.text = user.category
return cell
}
}
Table 查看单元格
import UIKit
class MyProfileCell: UITableViewCell {
@IBOutlet weak var profileCategory: UILabel!
@IBOutlet weak var profileID: UILabel!
@IBOutlet weak var profileUsername: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
数据
import Foundation
class MyProfileBasicData: NSObject {
var Id:String?
var username:String?
var category:String?
}
问题是 numberOfSectionsInTableView
和 numberOfRowsInSection
被定义为方法 inside getData
。如果将它们从 getData
方法中拉出,它们应该会被成功调用。请注意,当您将它们拉出时,编译器现在应该抱怨您需要添加 override
(就像您对 cellForRowAtIndexPath
所做的那样)。
我基于标准 table 视图问题的原始回复如下。
两个可能的问题是:
无法指定 table 视图的委托:
如果是这种情况,您的 UITableViewDataDelegate
方法将根本不会被调用。在这些例程中放入 breakpoints/log 语句并确认它们被调用。如果不是,请确认 table 视图的委托和数据源属性已正确设置。
无法将 UITableViewCell
子类中的 @IBOutlet
引用连接到原型单元格。
如果是这种情况,自定义单元格属性,例如cell.profileID
等,在cellForRowAtIndexPath
中会是nil
。如果它们是 nil
,则返回到 Interface Builder 并将它们连接起来。
我想创建一个 TableView,其中 return 只有一个单元格。在这个单元格中包含三个标签:id、username 和 category。这将导致让用户看到他的基本详细信息。
当我运行应用程序时,我的UITable视图仍然没有显示任何结果(空白)。
任何人都可以查看我的代码以使其正常工作吗?我看不出哪里错了,因为我在 Xcode
中没有收到任何错误Table视图控制器
import UIKit
import Alamofire
class MyProfile: UITableViewController {
var users = [MyProfileBasicData]()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
getData()
}
func getData() {
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
var username = prefs.valueForKey("USERNAME") as NSString
Alamofire.request(.GET, "http://mysite/app/data/jsonuser.php", parameters: ["username": username]).responseJSON() { (_, _, data, error) in if let jsonResult = data as? Array<Dictionary<String, String>> {
var UserID = jsonResult [0]["Id"]
var username1 = jsonResult [0]["username"]
var category = jsonResult [0]["category"]
for result in jsonResult {
var userInfo = MyProfileBasicData()
userInfo.Id = jsonResult [0]["Id"]
userInfo.username = jsonResult [0]["username"]
userInfo.category = jsonResult [0]["category"]
self.users.append(userInfo)
}
dispatch_async(dispatch_get_main_queue(),
{ self.tableView.reloadData()
})
println(UserID)
println(username1)
println(category)
}
println(error)
}
func didReceiveMemoryWarning() {
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath:
indexPath) as MyProfileCell
var user = users[indexPath.row]
cell.profileID?.text = user.Id
cell.profileUsername?.text = user.username
cell.profileCategory?.text = user.category
return cell
}
}
Table 查看单元格
import UIKit
class MyProfileCell: UITableViewCell {
@IBOutlet weak var profileCategory: UILabel!
@IBOutlet weak var profileID: UILabel!
@IBOutlet weak var profileUsername: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
数据
import Foundation
class MyProfileBasicData: NSObject {
var Id:String?
var username:String?
var category:String?
}
问题是 numberOfSectionsInTableView
和 numberOfRowsInSection
被定义为方法 inside getData
。如果将它们从 getData
方法中拉出,它们应该会被成功调用。请注意,当您将它们拉出时,编译器现在应该抱怨您需要添加 override
(就像您对 cellForRowAtIndexPath
所做的那样)。
我基于标准 table 视图问题的原始回复如下。
两个可能的问题是:
无法指定 table 视图的委托:
如果是这种情况,您的
UITableViewDataDelegate
方法将根本不会被调用。在这些例程中放入 breakpoints/log 语句并确认它们被调用。如果不是,请确认 table 视图的委托和数据源属性已正确设置。无法将
UITableViewCell
子类中的@IBOutlet
引用连接到原型单元格。如果是这种情况,自定义单元格属性,例如
cell.profileID
等,在cellForRowAtIndexPath
中会是nil
。如果它们是nil
,则返回到 Interface Builder 并将它们连接起来。