2017-03-17 32 views
0

我有一些自定義的UITableViewCell,並且會隨機使用它們中的一些。但是在我註冊之後,它會在tableView(_cellForRowAt:)中墜毀。 這裏是我的代碼: 在viewDidLoad方法在tableView中使用多個自定義UITableViewCell(_cellForRowAt :)

tableView.register(CustomACell.self, forCellReuseIdentifier: "Identifier") 
    tableView.register(CustomACell.self, forCellReuseIdentifier: "Identifier") 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let model = dataSource[indexPath.row] 
    if let type = model.type { 
     switch type { 
     case .A: 
      let cell = tableView.dequeueReusableCell(withIdentifier: MyIdentifier) as! CustomACell 
      cell.assgin(message: model) 
      return cell 

     case .B: 
      let cell = tableView.dequeueReusableCell(withIdentifier: MyIdentifier) as! CustomBCell 
      cell.assgin(message: model) 
      return cell 
     } 
    } 
    let cell = tableView.dequeueReusableCell(withIdentifier: MyIdentifier) as! CustomACell 
    cell.assgin(message: model) 
    return cell 
} 

如果我註冊這兩個,它會在情況.A墜毀。如果我不願意,其中一些會在tableView.dequeueReusableCell處崩潰。 這裏是控制檯錯誤信息之一:

無法投類型的值 'TM.CustomACell'(0x10bb40940)爲 'TM.CustomBCell'(0x10bb40578)。

+1

難道你有所有customCell故事板? – Surjeet

+0

在SB @Surjeet –

+0

中有沒有單元格的tableview,以及您是如何創建CustomACCell,CustomBCell等的。他們有單獨的xib文件或編程方式。 – Surjeet

回答

2

更改CellReuseIdentifiers。兩個自定義單元格都使用相同的名稱對不同的細胞使用不同的標識。

enter image description here

var nibName = UINib(nibName: "Identifier1", bundle: nil) 
     self.tableView.register(nibName, forCellReuseIdentifier: "Identifier") 

nibName = UINib(nibName: "Identifier2", bundle: nil) 
     self.tableView.register(nibName, forCellReuseIdentifier: "Identifier2") 

然後改變cellForRowAt,試試下面的代碼

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let model = dataSource[indexPath.row] 
    if let type = model.type { 
     switch type { 
     case .A: 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier1") as! CustomACell 
      cell.assgin(message: model) 
      return cell 

     case .B: 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier2") as! CustomBCell 
      cell.assgin(message: model) 
      return cell 
     default : 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier1") as! CustomACell 
      cell.assgin(message: model) 
      return cell 
     } 
    } 

} 
+0

謝謝,它適用於我。有什麼捷徑嗎?我有很多很多自定義單元格,如果是這樣,代碼似乎很笨拙。 –

0

,如果你創建了一個單獨Nib,那麼你可以否則註冊無需註冊

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->UITableViewCell{ 

    var cell = UITableViewCell(style: .default, reuseIdentifier: "pgIdentifier") 

    if (XXX == true) { 

      let pgtcell = tableView.dequeueReusableCell(withIdentifier: "indetifier", for: indexPath) as! CustomCell1 
    } else { 

      let pgtcell = tableView.dequeueReusableCell(withIdentifier: "indetifier", for: indexPath) as! MyCustomCell1 

    } 
}