在swift中生成的CustomTableViewCell cellIdentifier扩展名不可能吗?

时间:2015-09-18 13:26:15

标签: ios uitableview swift2

我使用了许多自定义实现的UITableViewCell子类。 每个都包含这段代码

    class CustomCell: UITableViewCell {

        static var cellIdentifier : String {
            return (NSStringFromClass(CustomCell.self) as NSString).lastPathComponent.componentsSeparatedByString(".").last!
        }
    }

我遵循的设计原则是特定单元格的cellIdentifier始终匹配单元格类名称,并且关联的xib文件也具有相同的名称。

  

CellClassName == CellXibName == CellIdentifier。

我试图避免只定义字符串常量 - 上帝知道TableView委托在需要队列中正确的单元格时要从哪里获取。 当我注册单元格时,我希望能够在Class中查询表示单元格标识符的静态公共属性。 上面的代码给了我这个。 然而,这显然是一个重复,因为我需要在每个CustomCell类中编写它。

你能帮我把它作为UITableViewCell的延伸吗? 我无法具体弄清楚如何替换

NSStringFromClass(CustomCell.self)  

有这样的东西

NSStringFromClass(Something here, that will return the real instance's name 
                  as String, even if this code is in the extension :-/ )

1 个答案:

答案 0 :(得分:2)

更简洁的解决方案:

使用以下代码创建一个名为“UITableViewCellExtension.swift”的新文件:

import UIKit

extension UITableViewCell {

   static var cellIdentifier : String {
       return (NSStringFromClass(self) as NSString).lastPathComponent.componentsSeparatedByString(".").last!
   }
}

所以这只会替换你问题中的代码:

NSStringFromClass(CustomCell.self)  

使用:

NSStringFromClass(self)  

其他解决方案:

iOS9 +解决方案

protocol Reusable {
    static var reuseIdentifier: String { get }
}

extension Reusable {
    static var reuseIdentifier: String {
        let mirror = Mirror(reflecting: self)
        return String(mirror.subjectType).stringByReplacingOccurrencesOfString(".Type", withString: "")
    }
}

extension UITableViewCell : Reusable {
}

受到http://codica.pl/2015/08/11/protocol-extensions-and-reuseidentifier-in-uitableview/

的启发

希望这有帮助。