この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは!モバイルアプリサービス部の加藤潤です。
今回はちょっとしたTipsを。
Xcodeでプロジェクト作成時にMaster-Detail Application
テンプレートを選択して作成した場合、MasterViewController
がUITableViewController
のサブクラスになっていて、セルを生成して返すメソッドは以下のような実装になっています。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let object = objects[indexPath.row] as! NSDate
cell.textLabel!.text = object.description
return cell
}
withIdentifier
のところでセルのIDを指定していますが、"Cell"
という文字列を指定しています。このセルIDは以下のようにstoryboard側でも同じIDを指定する必要があります。
セルのIDを何にするか
1つのアプリ内で複数のUITableViewCell
のサブクラスを作成して使う場合、「セルのIDを何にするか」、「どういったルールでIDをつけるか」は重要になってきます。
前述の通り、ソースコードとstoryboardで同じIDにする必要があるため一定のルールを決めておいた方が良いでしょう。そのルールとして私がよく採用しているのが、「セルのIDとしてセルのクラス名を採用する」です。
このルールであればセルのIDを何にするか都度悩む必要も無くなりますし、他のIDと重複することも無くなります。
では、withIdentifier: "Cell"
の"Cell"
のところをクラス名の文字列に変更して...
と思うかもしれませんが文字列をベタで書くのはタイポの可能性もあるのであまりよろしくないですね。
というわけで前置きが少し長くなりましたが、今回はセルのIDをクラス名にする(しかもも文字列をベタで書かない)方法をご紹介します。
開発環境
- Xcode Version 8.0 (8A218a)
- Swift 3.0
再利用IDを取得可能にするプロトコルを作成する
セルのIDをクラス名にするとはつまり、セルが自身のクラス名を返すようなインタフェースを備えれば良いということになります。
そこで、以下のようにReusable
というプロトコルを実装します。
import Foundation
protocol Reusable {
static var reuseIdentifier: String { get }
}
extension Reusable {
static var reuseIdentifier: String {
return String(describing: self)
}
}
reuseIdentifier
というプロパティを1つだけ持つプロトコルです。
このプロパティは当該プロトコルに準拠したオブジェクトの型名を返します。
Reusableプロトコルに準拠する
Reusableプロトコルを作成したので以下のようにUITableViewCellのサブクラスで当該プロトコルに準拠します。
// UITableViewCellのサブクラス
class MyTableViewCell: UITableViewCell {
}
// Reusableプロトコルに準拠
extension MyTableViewCell: Reusable {}
reuseIdentifierを使ってセルを取得する
ここまで出来たら後は使うだけです。
// MyTableViewCell.reuseIdentifierで"MyTableViewCell"が返る
let cell = tableView.dequeueReusableCell(withIdentifier: MyTableViewCell.reuseIdentifier, for: indexPath)
(Reusableプロトコルに準拠したオブジェクト).reuseIdentifierで型名が取得できます。 これでもうセルのIDベタ書きとはオサラバですね!
おわりに
今回は文字列をベタ書きせずにUITableViewCellのセルIDをクラス名にする方法をご紹介しました。ちなみに今回ご紹介した方法はUITableViewCell
だけでなくUICollectionViewCell
でも同様に使えます。よかったらお試しください。