登记
在 iOS 7 之后,这个过程被简化为(swift 3.0):
// For registering nib files
tableView.register(UINib(nibName: "MyCell", bundle: Bundle.main), forCellReuseIdentifier: "cell")
// For registering classes
tableView.register(MyCellClass.self, forCellReuseIdentifier: "cell")
(注意)这也可以通过在.xib
or.stroyboard
文件中创建单元格作为原型单元格来实现。如果你需要给它们附加一个类,你可以选择单元格原型并添加相应的类(UITableViewCell
当然必须是 的后代)。
出队
稍后,使用(swift 3.0)出列:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "Hello"
return cell
}
不同之处在于,这种新方法不仅使单元格出列,它还会创建不存在的单元格(这意味着您不必做if (cell == nil)
恶作剧),并且单元格已准备好使用,就像上面的示例一样。
(警告)tableView.dequeueReusableCell(withIdentifier:for:)
有新的行为,如果你调用另一个(没有indexPath:
)你会得到旧的行为,你需要自己检查nil
并实例化它,注意UITableViewCell?
返回值。
if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? MyCellClass
{
// Cell be casted properly
cell.myCustomProperty = true
}
else
{
// Wrong type? Wrong identifier?
}
当然,单元的关联类的类型是您在 .xib 文件中为UITableViewCell
子类定义的类型,或者使用其他注册方法。
配置
理想情况下,您的单元格在您注册它们时已经在外观和内容定位(如标签和图像视图)方面进行了配置,并且cellForRowAtIndexPath
您只需填写它们。
全部一起
class MyCell : UITableViewCell
{
// Can be either created manually, or loaded from a nib with prototypes
@IBOutlet weak var labelSomething : UILabel? = nil
}
class MasterViewController: UITableViewController
{
var data = ["Hello", "World", "Kinda", "Cliche", "Though"]
// Register
override func viewDidLoad()
{
super.viewDidLoad()
tableView.register(MyCell.self, forCellReuseIdentifier: "mycell")
// or the nib alternative
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return data.count
}
// Dequeue
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "mycell", for: indexPath) as! MyCell
cell.labelSomething?.text = data[indexPath.row]
return cell
}
}
当然,这在 ObjC 中都可以使用相同的名称。