Swift:使用静态表时,索引路径上的选择行返回nil

时间:2015-01-22 23:15:28

标签: ios swift

我正在我的应用程序中构建一个设置页面,因此使用静态单元格而不是动态单元格是有意义的,因为我从不在此视图中动态生成任何内容。

我采用了将表格拆分为每个类别的多个组的模式,即用户首选项,设置等。

我尝试使用UITableView委托方法didSelectRowAtIndexPath,但在调试时,我似乎总是为我的单元格传递一个空值。我需要做的是从标签中提取文本以描述没有segue的单元格的操作(例如Logout和Delete Account,这些只是提供一个确认模式,然后处理操作)

我的didSelectRowAtIndexPath方法:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath)

    if cell != nil {
        // Set the CellID
        var cellID: AnyObject! = (cell?.textLabel!.text == nil) ? "" : cell?.textLabel?.text

        // The values are hardcoded so we can switch with confidence
        switch cellID as String {
        case "Logout":
            logout()
        default:
            println("un-managed action \(cellID.localizedDescription) and \(cellID) index path: \(indexPath)")
        }
    }
}

为什么我总是打印nil?我唯一的猜测是它在所有可用部分中查找索引0并且不能假设我指向的是哪个单元格因此返回nil对象,一些澄清和解决方案会很棒

1 个答案:

答案 0 :(得分:3)

正如您的评论中所清楚的那样,您从未专门设置单元格的textLabel属性;您只在界面中向单元格添加了UILabel。假设您只为每个单元格添加了一个标签,您可以遍历单元格的子视图并通过查找UILabel子视图动态访问标签,例如:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath)

    if cell != nil {
        // Set the CellID

        var label:UILabel = UILabel()
        for subview in self.view.subviews {
            if subview is UILabel {
                label = subview as UILabel
                break
            }
        }

        var cellID: AnyObject! = (label.text == nil) ? "" : label.text

        // The values are hardcoded so we can switch with confidence
        switch cellID as String {
        case "Logout":
            logout()
        default:
            println("un-managed action \(cellID.localizedDescription) and \(cellID) index path: \(indexPath)")
        }
    }
}

如果您的单元格中有多个标签,则可以为每个标签添加标签,然后检查for循环中的标签。