登録
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?
}
そしてもちろん、セルに関連付けられたクラスのタイプは、UITableViewCell
サブクラスの.xibファイルで定義したタイプ、または他のレジスタメソッドを使用したタイプです。
構成
理想的には、セルは、それらを登録したときまでに、外観とコンテンツの配置(ラベルやイメージビューなど)に関してすでに構成されており、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で利用できます。