填充表格视图时,我的应用程序崩溃,因为它声称一个属性为零,但在我设置它之前打印该属性说它有一个值

Posted

技术标签:

【中文标题】填充表格视图时,我的应用程序崩溃,因为它声称一个属性为零,但在我设置它之前打印该属性说它有一个值【英文标题】:When populating a tableview, my app crashes because it claims that a property is nil, but printing that property before I set it says it has a value 【发布时间】:2017-06-02 18:47:40 【问题描述】:

我正在使用搜索栏搜索用户名数据库,并相应地更新 tableview 的 User() 数据库。搜索可以很好地更新数组,但是当我的 tableview 尝试将自己的标签更改为 User() 的名字时,我的应用程序崩溃了,因为它声称 firstName 为 nil。不过,我知道它不是零。在它尝试更新标签之前,我打印对象的属性并打印正确的用户名。我不知道我做错了什么。这是代码...

class AddFriendsVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate 

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!

var profiles = [User]()

override func viewDidLoad() 
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
    searchBar.delegate = self


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return profiles.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? FriendCell 
        let friend = profiles[indexPath.row]
        print(friend.firstName)  //PRINTS THE USERNAME...
        cell.nameLabel.text = friend.firstName //CRASHES HERE. firstName is of type "String!"
        return cell
    
    return tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)


func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 

    DataService.dataService.REF_USERNAMES.queryOrderedByKey().queryStarting(atValue: searchText).queryEnding(atValue: searchText+"\uf8ff").observeSingleEvent(of: .value, with:  (snapshot) in

        if snapshot.exists() 
            var results = [User]()
            if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] 
                for snap in snapshots 
                    print(snap.key)
                    let result = User(first: "\(snap.key)", last: "s", username: "s", activeTrip: "s")
                    results.append(result)

                    if snap == snapshots.last 
                        self.profiles = results
                        print(self.profiles[0].firstName) //PRINTS CORRECT USERNAME
                        self.tableView.reloadData()
                    
                
            

        
    )
  

每次我打印数据时,用户名都在那里......为什么这不起作用?

【问题讨论】:

错误说明了什么?它真的说firstName 是问题吗? 它说“致命错误:在展开可选值时意外发现 nil”并突出显示该行。那还能是什么? 我从上面的IBOutlets 看到您正在使用故事板,这意味着cell.nameLabel 可能是一个出口,因此类型为UILabel!。我猜插座没有正确连接,所以nameLabel 为零。 是的,就是这样。为它重新制作了另一个单元,它起作用了,很好的洞察力。如果您想回复真实的答案,我会将其标记为正确! 谢谢,很高兴它成功了! 【参考方案1】:

问题不是friend.firstName,而是cell.nameLabelIBOutlets 是隐式展开的可选选项,在本例中为 UILabel!,这意味着如果它们没有正确连接,它们将是 nil 并像你看到的那样崩溃。确保该属性已连接到该类并且应该修复它。

【讨论】:

以上是关于填充表格视图时,我的应用程序崩溃,因为它声称一个属性为零,但在我设置它之前打印该属性说它有一个值的主要内容,如果未能解决你的问题,请参考以下文章

当我将核心数据添加到表视图时,我的应用程序崩溃了

滚动表格视图时,iOS 应用程序随机崩溃,不确定如何处理引发的错误

表格视图不会推送到下一个视图

JSON 和 iPhone 表格视图

动态填充QTreeView,以便应用程序不会崩溃

UITableView 在快速滚动时崩溃