在swift中的一个xib下加载多个uitableview单元格

时间:2016-08-12 07:50:41

标签: ios swift uitableview

我知道我们可以在Objective C中的一个xib下加载多个uitableview单元格,但它是否也可以在swift中加载?

我尝试使用在Objective C中使用的相同逻辑

var cellAuditDetails:AuditDetailsTableViewCell! = tableView.dequeueReusableCellWithIdentifier("customTrialDetailsCell", forIndexPath: indexPath) as! AuditDetailsTableViewCell

            if indexPath.row == 0{
               if(cellAuditDetails == nil)
               {
                  cellAuditDetails = NSBundle.mainBundle().loadNibNamed("AuditDetailsTableViewCell", owner: self, options: nil)[0] as! AuditDetailsTableViewCell;
               }
            }
            else{
                  cellAuditDetails = NSBundle.mainBundle().loadNibNamed("AuditDetailsTableViewCell", owner: self, options: nil)[1] as! AuditDetailsTableViewCell;
}

enter image description here

但得到以下错误***Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier (customTrialDetailsCell) - nib must contain exactly one top level object which must be a UITableViewCell instance'

现在,如果我只使用一个细胞,那就好了。但是如何在同一个xib下加载多个单元格呢?因为每个新细胞都需要另外一个xib。

2 个答案:

答案 0 :(得分:0)

如果您区分XIB中的视图(标签,自定义类等),那么您甚至不需要注册笔尖 - 您只需要这样做:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cellIndex = 12345
    var cellIdentifier = "MyAwesomeCell"

    // dequeue cell or, if it doesn't exist yet, create a new one from the nib
    var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
    if !cell {
        var topLevelObjects = Bundle.main.loadNibNamed("MyNibWithLotsOfCustomCells", owner: self, options: nil)
        var index = (topLevelObjects as NSArray).indexOfObject(passingTest: {(_ obj: Any, _ idx: Int, _ stop: Bool) -> BOOL in
                // if you distinguish the views by class
                return type(of: obj) === NSClassFromString(cellIdentifier)

                // if you distinguish the views by tag
                return (obj as! UIView).tag == cellIndex
            })
        cell = topLevelObjects[index]
    }
}

还有一件事需要记住,使用

dequeueReusableCell(withIdentifier:cellIdentifier)

而不是

dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)

答案 1 :(得分:0)

不知怎的,我设法在Swift 3中解决了这个问题。感谢@ waris-shams。这是解决方案:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     var cell = tableView.dequeueReusableCell(withIdentifier: "customCell")

     if indexPath.row == 0{
        if(cell == nil)
        {
             let cellAuditDetails:AuditDetailsTableViewCell = Bundle.main.loadNibNamed("AuditDetailsTableViewCell", owner: self, options: nil)? [0] as! AuditDetailsTableViewCell
             cell = cellAuditDetails
         }
      }
      else{
           if(cell == nil)
           {
              let cellAuditDetails:AuditDetailsTableViewCell = Bundle.main.loadNibNamed("AuditDetailsTableViewCell", owner: self, options: nil)? [1] as! AuditDetailsTableViewCell
              cell = cellAuditDetails
           }
      }
}