Регистрация
После 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
или .stroyboard
в качестве ячеек-прототипов.
Если вам нужно присоединить к ним класс, вы можете выбрать прототип ячейки и добавить соответствующий класс (конечно, должен быть потомком UITableViewCell
).
Dequeue
и позже, исключено из использования ( 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 с такими же именами.