之前在使用UITableView时,总是在Storeboard里直接把property cell放到相应ViewController的Table里。如果一个cell需要在其他ViewController里进行复用,我们可以直接在IB里进行复制,粘贴,这样虽然比较简单,但以后项目维护过程中,某个cell发生了改变,要重复该操作,且不能遗漏修改。可以在xib中设计cell来进行复用。
操作步骤:
1. 新建一个empty xib文件
File -> New File -> User Interface -> Empty
这里记得选用 Empty 来创建一个空的xib文件。
2. 在IB中设计cell
打开刚才新建的xib文件(这里暂时命名为CellUI),拖入一个Table View Cell
,自定义其size,然后根据需要设计该cell。
这个cell就是我们的自定义cell了。
3. 使用cell
我们可以新建一个继承与UITableViewcell的类(TabLocationTableCell),将cell中的文本等元素与其关联。
在TableView的delegate里,我们自定义个resueID,修改cellForRowAtIndexPath
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell: AnyObject? = self.tableView.dequeueReusableCellWithIdentifier(self.resueCellID) //1
if nil == cell {
let viewList = NSBundle.mainBundle().loadNibNamed("CellUI", owner: self, options: nil) //2
for obj in viewList {
if obj is TabLocationTableCell {
cell = obj as? TabLocationTableCell //3
break
}
}
}
if let cell = cell as? TabLocationTableCell {
cell.nameTxt.text = self.jsonDataList![indexPath.row]["GrpName"].stringValue //4
return cell
}
println("never goes here") //5
return UITableViewCell()
}
代码说明:
- 使用
func dequeueReusableCellWithIdentifier(_ identifier: String) -> AnyObject?
来获取一个可用的cell。注意这里没有传入indexPath
- 如果没有可复用的cell,则加载xib,生成一个该cell
- 一个xib中可以放入多个view,从中找到我们需要的cell
- 可以对改cell内容进行赋值
- 程序应该永远运行不到这里,如果出现此信息,重新检查你的代码
** 补充: **
采用这种方法时,不需要调用 self.tableView.registerClass
。
以前在storyboard里直接设计cell时,我们都会使用dequeueReusableCellWithIdentifier:forIndexPath:
来获取可复用的cell,该方法才需要提前registerClass (IB里可以指定ID,会自动帮我们做)。否则,会收到错误:
Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘unable to dequeue a cell with identifier locationCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard’
(完)