我无法让 UITableViewController 显示任何数据
I cannot get UITableViewController to display any data
我已经做了将近两天了。我无法让它显示任何东西。我要一步一步来,因为我不知道问题是什么。
我从空 Main.storyboard 开始。
我拖一个Table视图控制器到Main.storyboard。
我将 Table 视图控制器嵌入到导航控制器中。
我创建了一个 Cocoa Touch Class UITableViewController
文件。我将其命名为TableViewController.
我在拖动的 Table 视图控制器的身份检查器窗格中的自定义 Class 下的 Class 文本字段中键入 TableViewController。
我创建了一个 Cocoa Touch Class UITableViewCell
文件。我将其命名为 TableViewCell.
class TableViewController: UITableViewController {
let users = NSMutableArray()
override func viewDidLoad() {
// Register class
self.tableView.registerClass(TableViewCell.self, forCellReuseIdnetifier: "TVC")
// Since the Table View Controller I dragged onto Main.storyboard has outlets `dataSource` and `delegate` set to TableViewController, I do not need to set dataSource and delegate in code, correct? Either way, I've tried both ways.
// Load data
self.loadData()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
// Load data
func loadData() {
self.users.removeAllObjects()
let query = PFQuery(className: "User")
query.findObjectsInBackgroundWithBlock {(objects: [PFObject]?, error: NSError?) -> Void in
if error == nil {
for person in objects! {
self.users.addObject(person)
// The print statement here is printing
}
self.tableView.reloadData()
}
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let personCell = tableView.dequeueReusableCellWithIdentifier("TVC", forIndexPath: indexPath) as! EventTableViewCell
let person = self.users.objectAtIndex(indexPath.row)
personCell.userName.text = (event.objectForKey("email") as! String)
return personCell
}
.
class TableViewCell: UITableViewCell {
let userName = UILabel()
// I'm assuming the reuseIdentifier below should be the same as the one in TableViewController
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: "TVC")
userName.text = PFUser.currentUser()!.email
userName.translatesAutoresizingMaskIntoConstraints = false
self.contentView.addSubview(userName)
self.contentView.addConstraint(NSLayoutConstraint(item: UserName,
attribute: .CenterX,
relatedBy: .Equal,
toItem: self.contentView,
attribute: .CenterX,
multiplier: 1,
constant: 0))
self.contentView.addConstraint(NSLayoutConstraint(item: userName,
attribute: .CenterY,
relatedBy: .Equal,
toItem: self.contentView,
attribute: .CenterY,
multiplier: 1,
constant: 0))
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
}
所以我希望看到许多单元格,每个单元格中有一个标签。每个标签都基于每个单元格以 X 和 Y 为中心。
对不起,代码墙,但我真的很困惑。
loadData 函数是否从不在您的示例中的某个地方被调用?如果没有,我假设你想做这样的事情:
override func viewDidLoad() {
super.viewDidLoad() // <-- don't forget this part
self.tableView.registerClass(TableViewCell.self, forCellReuseIdnetifier: "TVC")
// Yup, your `dataSource` and `delegate` outlets are correct
// Now load up the data
loadData()
}
如果这对你有用,那么我会从 loadData 函数中删除它
self.tableView.reloadData()
我明白了。约束实际上并没有被执行。我错误地认为 TableViewCell
中的 override init()
表现得像 viewDidLoad()
。所有这些代码实际上都应该移到一个新的覆盖函数中。
override func layoutSubviews() {
// Set attributes, add to contentView, set constraints, etc.
}
我已经做了将近两天了。我无法让它显示任何东西。我要一步一步来,因为我不知道问题是什么。
我从空 Main.storyboard 开始。
我拖一个Table视图控制器到Main.storyboard。
我将 Table 视图控制器嵌入到导航控制器中。
我创建了一个 Cocoa Touch Class UITableViewController
文件。我将其命名为TableViewController.
我在拖动的 Table 视图控制器的身份检查器窗格中的自定义 Class 下的 Class 文本字段中键入 TableViewController。
我创建了一个 Cocoa Touch Class UITableViewCell
文件。我将其命名为 TableViewCell.
class TableViewController: UITableViewController {
let users = NSMutableArray()
override func viewDidLoad() {
// Register class
self.tableView.registerClass(TableViewCell.self, forCellReuseIdnetifier: "TVC")
// Since the Table View Controller I dragged onto Main.storyboard has outlets `dataSource` and `delegate` set to TableViewController, I do not need to set dataSource and delegate in code, correct? Either way, I've tried both ways.
// Load data
self.loadData()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
// Load data
func loadData() {
self.users.removeAllObjects()
let query = PFQuery(className: "User")
query.findObjectsInBackgroundWithBlock {(objects: [PFObject]?, error: NSError?) -> Void in
if error == nil {
for person in objects! {
self.users.addObject(person)
// The print statement here is printing
}
self.tableView.reloadData()
}
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let personCell = tableView.dequeueReusableCellWithIdentifier("TVC", forIndexPath: indexPath) as! EventTableViewCell
let person = self.users.objectAtIndex(indexPath.row)
personCell.userName.text = (event.objectForKey("email") as! String)
return personCell
}
.
class TableViewCell: UITableViewCell {
let userName = UILabel()
// I'm assuming the reuseIdentifier below should be the same as the one in TableViewController
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: "TVC")
userName.text = PFUser.currentUser()!.email
userName.translatesAutoresizingMaskIntoConstraints = false
self.contentView.addSubview(userName)
self.contentView.addConstraint(NSLayoutConstraint(item: UserName,
attribute: .CenterX,
relatedBy: .Equal,
toItem: self.contentView,
attribute: .CenterX,
multiplier: 1,
constant: 0))
self.contentView.addConstraint(NSLayoutConstraint(item: userName,
attribute: .CenterY,
relatedBy: .Equal,
toItem: self.contentView,
attribute: .CenterY,
multiplier: 1,
constant: 0))
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
}
所以我希望看到许多单元格,每个单元格中有一个标签。每个标签都基于每个单元格以 X 和 Y 为中心。
对不起,代码墙,但我真的很困惑。
loadData 函数是否从不在您的示例中的某个地方被调用?如果没有,我假设你想做这样的事情:
override func viewDidLoad() {
super.viewDidLoad() // <-- don't forget this part
self.tableView.registerClass(TableViewCell.self, forCellReuseIdnetifier: "TVC")
// Yup, your `dataSource` and `delegate` outlets are correct
// Now load up the data
loadData()
}
如果这对你有用,那么我会从 loadData 函数中删除它
self.tableView.reloadData()
我明白了。约束实际上并没有被执行。我错误地认为 TableViewCell
中的 override init()
表现得像 viewDidLoad()
。所有这些代码实际上都应该移到一个新的覆盖函数中。
override func layoutSubviews() {
// Set attributes, add to contentView, set constraints, etc.
}