为什么Swift UITableViewController模板在tableView cellForRowAtIndexPath方法中使用optionals参数?

时间:2014-06-06 09:30:10

标签: ios xcode uitableview swift

如果您创建新的UITableViewController类,您将看到覆盖的注释方法:

/*
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

    // Configure the cell...

    return cell
}
*/

您可以取消注释方法,但由于错误

,它将无效
'UITableView?' does not have a member named 'dequeueReusableCellWithIdentifier'

原因是:tableView被定义为可选类型" UITableView?"并且在调用方法之前必须解包tableView。例如:

let cell = tableView!.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

但我们可以让他们隐式展开选项并使用tableView而不使用

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
    return cell
}

问题是:为什么xcode将它们定义为选项?是否有任何理由或优势与隐含的未解决的期权?可以肯定的是,这种方法总是得到非零值吗?

我们还会有其他错误

Constant 'cell' inferred to have type 'AnyObject!', which may be unexpected
Type 'AnyObject!' cannot be implicitly downcast to 'UITableViewCell'; did you mean to use 'as' to force downcast?

我们可以通过添加UITableViewCell来修复它,如下所示:

let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell

我不知道为什么默认情况下模板看起来不像这样:

/*
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell //or your custom class

    // Configure the cell...

    return cell
}
*/

2 个答案:

答案 0 :(得分:22)

实际上这是使用委托方法的正确方法。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CELL_ID", forIndexPath: indexPath)
    cell.textLabel.text = "aaaa"
    return cell

}

答案 1 :(得分:17)

是的,这很奇怪。事实上,如果你删除模板提供的方法并开始键入每个方法,Xcode自动完成将建议使用隐式解包的可选参数的方法,如

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

我猜模板目前是错误的,可能会在以后修复,因为在手动输入时甚至没有提示模板版本。如果你把它们留在那里,它们会被正常调用,只要你根据需要正确地打开参数,它就会起作用。

有关讨论的更多信息,请参阅this question