无法返回cellForRowAtIndexPath中的单元格

Pet*_*Pik 1 uitableview ios swift

我正在尝试在tableView中返回不同的单元格.通常在这种情况下,我将返回不同的单元格,然后在底部返回nil,但在这种情况下,它给了我和错误.我也尝试过返回一个空单元格,但也给了我错误.

我试过的

return nil
Run Code Online (Sandbox Code Playgroud)

 var cell: UITableViewCell!
  return cell
Run Code Online (Sandbox Code Playgroud)

但两者都返回了错误.我怎样才能解决这个问题?

cellForRowAtIndex

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




    if indexPath.row == 0 {


        let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("imageCell", forIndexPath: indexPath) as UITableViewCell
        var imageFile = cell.viewWithTag(100) as PFImageView
        imageFile.image = itemFile


        cell.selectionStyle = UITableViewCellSelectionStyle.None
        return cell

    } else if indexPath.row == 1 {
        let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("segmentCell", forIndexPath: indexPath) as UITableViewCell

        var titleLabel = cell.viewWithTag(101) as UILabel?
        titleLabel?.text = itemTitle

        let segmentControl = cell.viewWithTag(102) as UISegmentedControl
        segmentControl.selectedSegmentIndex = segment
        segmentControl.setTitle("Beskrivelse", forSegmentAtIndex: 0)
        segmentControl.setTitle("Sælger", forSegmentAtIndex: 1)
        segmentControl.setTitle("Lokation", forSegmentAtIndex: 2)
        segmentControl.tintColor = UIColor(rgba: "#619e00")
        var font = UIFont(name: "Lato-Regular", size: 11)
        var attributes:NSDictionary = NSDictionary(object: font , forKey: NSFontAttributeName)
        segmentControl.setTitleTextAttributes(attributes, forState: UIControlState.Normal)
        segmentControl.addTarget(self, action: "segmentAction:", forControlEvents: .ValueChanged)


        cell.selectionStyle = UITableViewCellSelectionStyle.None

        return cell

    } else if indexPath.row == 2 {
        switch segment {
        case 0:
            let cell = tableView.dequeueReusableCellWithIdentifier("CellZero", forIndexPath: indexPath) as DescViewCell
            return cell
        case 1:
            let cell = tableView.dequeueReusableCellWithIdentifier("CellOne", forIndexPath: indexPath) as SellerViewCell
            return cell
        case 2:
            let cell = tableView.dequeueReusableCellWithIdentifier("CellTwo", forIndexPath: indexPath) as LocationViewCell
            return cell
        default:
            break

        }
    }


    var cell: UITableViewCell!
    return cell
}
Run Code Online (Sandbox Code Playgroud)

Ima*_*tit 5

前一个类似问题的答案所示,-tableView:cellForRowAtIndexPath:必须返回一个UITableViewCell.所以你不能回来nil.但是,我还建议在-tableView:cellForRowAtIndexPath:使用if elseswitch语句时尽量避免返回以下代码:

//bad code design
var cell: UITableViewCell!
return cell
Run Code Online (Sandbox Code Playgroud)

要么:

//bad code design
var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
return cell
Run Code Online (Sandbox Code Playgroud)

您可以创建更好的代码,而不是创建一个UITableViewCell永远不会被调用的实例,以便静默Xcode警告!

那么解决方案是什么?

关键是要确保if else语句的最后一个可能值是在else(不在else if)中设置的.以同样的方式,关键是要确保设置switch语句的最后一个可能值default:(不在其中case XXX:).

因此,您的代码应如下所示:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("CellZero", forIndexPath: indexPath) as UITableViewCell
        /* ... */
        return cell
    } else if indexPath.row == 1 {
        let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("CellOne", forIndexPath: indexPath) as CellOne
        /* ... */
        return cell
    } else { //set your last indexPath.row case in "else", not in "else if indexPath.row == 2"!!!
        switch segment {
        case 0:
            let cell = tableView.dequeueReusableCellWithIdentifier("CellTwo", forIndexPath: indexPath) as CellTwo
            /* ... */
            return cell
        case 1:
            let cell = tableView.dequeueReusableCellWithIdentifier("CellThree", forIndexPath: indexPath) as CellThree
            /* ... */
            return cell
        default: //set your last segment case in "default:", not in "case 2:"!!!
            let cell = tableView.dequeueReusableCellWithIdentifier("CellFour", forIndexPath: indexPath) as CellFour
            /* ... */
            return cell
        }
    }
    //No need for a fictive "return cell" with this code!!!
}
Run Code Online (Sandbox Code Playgroud)

如果segment不是可选的,多亏了元组,你甚至可以将以前的代码减少到这个:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    switch (indexPath.row, segment) {
    case (0, _):
        let cell = tableView.dequeueReusableCellWithIdentifier("CellZero", forIndexPath: indexPath) as UITableViewCell
        /* ... */
        return cell
    case (1, _):
        let cell = tableView.dequeueReusableCellWithIdentifier("CellOne", forIndexPath: indexPath) as CellOne
        /* ... */
        return cell
    case (2, 0):
        let cell = tableView.dequeueReusableCellWithIdentifier("CellTwo", forIndexPath: indexPath) as CellTwo
        /* ... */
        return cell
    case (2, 1):
        let cell = tableView.dequeueReusableCellWithIdentifier("CellThree", forIndexPath: indexPath) as CellThree
        /* ... */
        return cell
    default: //case (2, 2)
        let cell = tableView.dequeueReusableCellWithIdentifier("CellFour", forIndexPath: indexPath) as CellFour
        /* ... */
        return cell
    }
}
Run Code Online (Sandbox Code Playgroud)