Я не могу получить 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()
Другие вопросы по тегам