无法解包可选。没有 UITableViewCell

Posted

技术标签:

【中文标题】无法解包可选。没有 UITableViewCell【英文标题】:Can't unwrap optional. No UITableViewCell 【发布时间】:2014-06-10 11:10:55 【问题描述】:

我有一个表格视图,其中有一个自定义表格视图单元格。我的问题是,当我尝试为自定义 UITableViewCell 中的变量赋值时,我得到了声明的错误。现在,我认为是因为上述变量没有初始化,但它让我完全难住了。

这是自定义表格单元格:

import Foundation
import UIKit

class LocationGeographyTableViewCell: UITableViewCell

    //@IBOutlet var Map : MKMapView;

    @IBOutlet var AddressLine1 : UILabel;
    @IBOutlet var AddressLine2 : UILabel;
    @IBOutlet var County : UILabel;
    @IBOutlet var Postcode : UILabel;
    @IBOutlet var Telephone : UILabel;

    var location = VisitedLocation();

    func Build(location:VisitedLocation) -> Void
    
        self.location = location;

        AddressLine1.text = "test";
    

我在索引路径处的行单元格是:

 override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
    

        var addressCell = tableView.dequeueReusableCellWithIdentifier("ContactDetail") as? LocationGeographyTableViewCell;

        if !addressCell
        
            addressCell = LocationGeographyTableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "ContactDetail");
        

        addressCell!.Build(Location);

        return addressCell;
    

正如我所说的,我完全感到困惑,Build 函数调用了 UITableViewCell 中的正确函数。

任何帮助将不胜感激。

【问题讨论】:

id为“ContactDetail”的单元格如何设置? 您在第二个代码 sn-p 中传递给 Build 函数的 Location 是什么? 位置只是一个平面对象,我目前没有使用它。对其中的实体执行 println 会输出正确的值。 ContailDetail 单元格 - 样式:自定义,其余为新 tableviewcell 的标准。自定义类设置为 LocationGeographyTableViewCell。 那么您对AddressLine1 有疑问吗?不是您的 location 变量?更多细节会很好...... 【参考方案1】:

我刚刚用你的代码做了一个简单的项目,我有一个 nil“AddressLine1”标签,这会导致你遇到同样的错误。我想我们也有同样的问题。

我通过将标识符“ContactDetail”添加到故事板的原型单元格来解决它。

我还建议您稍微更改一下代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell         
    // This newer API ensures that you always get a cell, so no need for optionals. 
    // Also note the "let" that is preferred since you don't plan on changing addressCell
    let addressCell = tableView.dequeueReusableCellWithIdentifier("ContactDetail", forIndexPath: indexPath) as LocationGeographyTableViewCell; 

    //addressCell.Build(Location); // the cell is a view, views should not know about model objects

    addressCell.AddressLine1 = Location.addressLine1
    // ... same for all labels, or do all that in a "configureCell" function

    return addressCell;

【讨论】:

我想知道 - 为什么视图不应该知道模型对象?这会使架构变得更加复杂。 这是 MVC 模式的描述方式。控制器应该是视图和模型之间的链接。一个优点是您可以在项目之间重用您的视图,因为它们不依赖于模型。其他模式也有(可以看MVVM,有点不一样),但MVC还是苹果给的标准。 我想我写错了我之前的评论,但没关系。所述代码在我的初始视图中运行良好,但是当我使用 segue 推送新控制器时,自定义 tableview 单元格具有所有 Optional.Nil 问题。所有标识符都是正确的,我已经双重、三重和四重检查了它的设置是否与父控制器相同,但我得到了声明的错误。 您认为您可以将您的项目公开,还是提供一个重现问题的简单版本,以便我们使用实际代码进行调查? 我已经把它放在了下拉框中:link LocationGeographyTableViewCell 是它抛出错误的地方,单击第一个 tableview 上的一个单元格,它会推动一个 segue,然后中断。谢谢垫【参考方案2】:

我终于解决了。我没有使用情节提要来定义 UITableViewCell(就像我在父视图控制器中所做的那样),而是创建了一个带有内容的 Xib 并将其连接到单元格的类,在 TableViewController 中引用它并在单元格创建方法中分配它.

viewDidLoad()

        var nib = UINib(nibName: "LocationTableViewCell", bundle: nil)

        tableView.registerNib(nib, forCellReuseIdentifier: "locationCell")  


var cell:LocationGeographyTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("locationCell") as LocationGeographyTableViewCell
cell.AddressLine1.text = "teetetette";
return cell;

【讨论】:

以上是关于无法解包可选。没有 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

tableview reloadData在解包可选值时崩溃意外发现的nil

访问无价值的隐式解包可选?

强制解包可选导致过滤器中的崩溃

Alamofire URL 请求 - 解包可选值时意外发现 nil

Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]

@IBInspectable 致命错误:在展开可选值时意外发现 nil