我知道我们可以在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;
}
但得到以下错误***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。
答案 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
}
}
}