无法返回 cellForRowAtIndexPath 中的单元格

2023-11-30

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

我尝试过的

return nil

and

 var cell: UITableViewCell!
  return cell

但都返回错误。我怎样才能解决这个问题?

cellForRowAt 索引

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
}

如a中所示之前对类似问题的回答, -tableView:cellForRowAtIndexPath:必须返回一个UITableViewCell。所以你无法返回nil。但是,我还建议避免在末尾返回以下代码-tableView:cellForRowAtIndexPath:当你使用if else or switch里面的语句:

//bad code design
var cell: UITableViewCell!
return cell

or:

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

您可以编写比创建更好的代码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!!!
}

If segment不是一个可选的,感谢tuples,您甚至可以将前面的代码简化为:

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
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法返回 cellForRowAtIndexPath 中的单元格 的相关文章

随机推荐