LoginSignup
5
5

More than 5 years have passed since last update.

UITableViewCellのidentifierをスッキリする

Last updated at Posted at 2016-08-30

追記 2016/11/20

便利なExtensionを見つけたので、最近はそれを使っています。

extension NSObject{
    class var className: String{
        return String(describing: self)
    }

    var className: String{
        return type(of: self).className
    } 
}

これを使えば

let textFieldCell = UINib(nibName: InputTextFieldCell.className,    bundle: nil)
    self.tableView.registerNib(textFieldCell, forCellReuseIdentifier: InputTextFieldCell.className)

このように書けて、いちいち各クラスでidentiferを作る必要もなくなりました。

動機

UITableViewCellはよく使うしサブクラスも多様するが、

tableViewでよくあるやつ
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

みたいに書くといまいちだし、

IDを宣言
let reuseIdentifer = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifer, forIndexPath: indexPath)

にしても気持ち悪かったので、スマートにやれる方法を考えた。

class変数の計算型プロパティを使う

UITableViewCellのエクステンションで

UITableViewCellExtention.swift
extension UITableViewCell{
    class var identifer: String{ return "Cell"}
}

このようにして、サブクラス(仮にInputTextFieldCell)

InputTextFieldCell.swift
class InputTextFieldCell: UITableViewCell {
    override class var identifer: String{ return "InputTextFieldCell"}
(中略)
    }

とする。

呼び出し側

let cell = tableView.dequeueReusableCellWithIdentifier(UITableViewCell.identifer, forIndexPath: indexPath)
let textFieldCell = UINib(nibName: InputTextFieldCell.identifer, bundle: nil)
        self.tableView.registerNib(textFieldCell, forCellReuseIdentifier: InputTextFieldCell.identifer)

このようになる。

static let を使わない理由

static 変数はOverrideができないため、UITableViewCellでidentifierという名前を使ってしまうと以降使えないから。

終わり

よかったら試してみてください。
間違いなり指摘なりあればコメントお願いします。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5