我无法让 UITableViewController 显示任何数据

Posted

技术标签:

【中文标题】我无法让 UITableViewController 显示任何数据【英文标题】:I cannot get UITableViewController to display any data 【发布时间】:2016-01-09 06:39:16 【问题描述】:

我已经在这里待了将近两天了。我无法让它显示任何东西。我要一步一步来,因为我不知道问题是什么。

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

我将一个 Table View Controller 拖到 Main.storyboard。

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

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

我在拖动的表视图控制器的身份检查器窗格中的自定义类下的类文本字段中键入 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 为中心。

对不起,代码墙,但我真的很难过。

【问题讨论】:

你设置委托了吗? 当我将情节提要上的 Table View Controller 链接到 TableViewController 时,似乎设置了委托。 【参考方案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()

【讨论】:

对不起,我忘了在示例中添加它。我实际上在self.tableView.registerClass() 上面有它,我希望这就是原因。但是移到下面还是不行。我刚刚意识到我在loadData() 的for 循环中有一个打印语句,我不确定它何时停止打印到控制台。但它停止了。我希望你知道你的 Parse,并能告诉我为什么我的 objects 数组中没有 person 对象。我在默认的User Parse 类中有两个用户行。 好的,我编辑了问题,并在 for 循环中添加了注释,所以现在正在打印。所以现在我知道用户中有一个对象。所以我认为问题出在override func tableView() 哦!我看到另一件事。在您的 UITableViewCell 中,在初始化程序中,在设置 AutoLayout 约束之前,您是否将标签添加到视图层次结构中?像这样的东西:self.contentView.addSubview(userName) 你说得对,我忘了在我的实际代码中添加它。但是,它并不能解决问题。如果没有其他人看到任何东西,我可能最终会以非编程方式执行此操作。至少我现在对这个类是如何工作的有一个大致的了解。【参考方案2】:

我想通了。约束实际上并未被执行。我错误地认为TableViewCell 中的override init() 表现得像viewDidLoad()。所有这些代码实际上都应该移到一个新的覆盖函数中。

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

【讨论】:

以上是关于我无法让 UITableViewController 显示任何数据的主要内容,如果未能解决你的问题,请参考以下文章

UIActionSheet 事件未触发

ReloadData (UITableView) 不起作用

表格视图不显示单元格中的内容

以一种奇怪的方式触地射击

UINavigationController 中的仅横向 UIViewController

仅更改 UITableView 中一个部分的页脚大小