无法解包可选。没有 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