我无法让UITableViewController显示任何数据

时间:2016-01-09 06:39:17

标签: ios swift uitableview parse-platform programmatically-created

我已经在这里呆了差不多两天了。我不能让它显示任何东西。我会一步一步走,因为我不知道问题是什么。

我从一个空的Main.storyboard开始。

我将Table View Controller拖到Main.storyboard。

我将表视图控制器嵌入导航控制器中。

我创建了一个Cocoa Touch类UITableViewController文件。我把它命名为TableViewController。

我在拖动的表视图控制器的标识检查器窗格中的“自定义类”下的“类”文本字段中键入TableViewController。

我创建了一个Cocoa Touch类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 个答案:

答案 0 :(得分:1)

是否从样本中没有的某个地方调用了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()

答案 1 :(得分:1)

我明白了。实际上并没有执行约束。我错误地认为override init()中的TableViewCell表现得像viewDidLoad()。所有代码实际上应该移动到新的覆盖函数。

override func layoutSubviews() { // Set attributes, add to contentView, set constraints, etc. }