Я не могу получить UITableViewController для отображения каких-либо данных
Я был на этом почти два дня. Я не могу заставить его что-либо отображать. Я собираюсь идти шаг за шагом, потому что я понятия не имею, в чем проблема.
Я начинаю с пустой Main.storyboard.
Я перетаскиваю контроллер табличного представления на Main.storyboard.
Я встроил контроллер табличного представления в контроллер навигации.
Я создаю Какао Touch Touch Class UITableViewController
файл. Я называю это TableViewController.
Я набираю TableViewController в текстовом поле "Класс" в разделе "Пользовательский класс" на панели инспектора идентификации перетаскиваемого контроллера табличного представления.
Я создаю Какао Touch 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 на основе каждой ячейки.
Извините за стену кода, но я действительно в тупик.
2 ответа
Я понял. Ограничения на самом деле не выполнялись. Я сделал ошибку, думая, что override init()
в TableViewCell
действовал как viewDidLoad()
, Весь этот код должен быть перемещен в новую функцию переопределения.
override func layoutSubviews() {
// Set attributes, add to contentView, set constraints, etc.
}
Функция 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()