为不同的UITableViewCell类创建单个.xib

PGD*_*Dev 14 uitableview xib ios swift

我正面临一个问题

我有一个NNVerticalStackTableViewCell.xib文件及其相应的NNVerticalStackTableViewCell.swift文件.

NNVerticalStackTableViewCell.swift文件代码

class NNVerticalStackTableViewCell: UITableViewCell
{
    //MARK: Outlets
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var verticalStack: NNVerticalStackView!

    //MARK: Internal Properties
    var titleString : String?
        {
        set{
            self.titleLabel.text = newValue
        }
        get{
            return self.titleLabel.text
        }
    }

    //MARK: View Lifecycle Methods
    override func awakeFromNib()
    {
        super.awakeFromNib()
        self.titleLabel.text = nil
    }

    //MARK: Internal Methods
    func addViewsInVerticalStack(viewsArray : [UIView])
    {
        for view in viewsArray
        {
            self.verticalStack.insertStackItem(view)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

NNVerticalStackTableViewCell.xib文件界面

在此输入图像描述

class nameas:NNVerticalStackTableViewCellcell identifieras:NNVerticalStackTableViewCell

现在我创建了一个子类NNVerticalStackTableViewCell:

class NNPropertiesUnderProjectTableViewCell: NNVerticalStackTableViewCell
{
    //MARK: Internal Properties
    var completionHandler : ((NNSearchPreference) -> Void)?

    //MARK: Internal Methods
    func configureCell(_ propertiesUnderProjectArray : [[String : Any]])
    {
        var viewsArray = [UIView]()
        for dict in propertiesUnderProjectArray
        {
            let elementView = NNPropertiesUnderProjectElementView.loadFromNib()
            elementView?.configureViewWith(buttonTitleString: dict["displayString"] as! String, searchPreference: dict["searchPreference"] as! NNSearchPreference, completionHandler: {[weak self] (searchPreference) in
                if let handler = self?.completionHandler
                {
                    handler(searchPreference)
                }
                })
            viewsArray.addObject(elementView)
        }
        self.addViewsInVerticalStack(viewsArray: viewsArray)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想做的是使用NNPropertiesUnderProjectTableViewCellNNVerticalStackTableViewCell.xib接口的类.

NNPropertiesUnderProjectTableViewCell类I 类似,有许多其他类使用相同的接口,NNVerticalStackTableViewCell.xib并相应地对其进行自定义.

在我ViewController,我注册NNVerticalStackTableViewCell.xib,然后创建单元格:

self.tableView.register(UINib(nibName: "NNVerticalStackTableViewCell"), forCellReuseIdentifier: "NNVerticalStackTableViewCell")


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
            let propertiesUnderProjectCell = tableView.dequeueReusableCell(withIdentifier: "NNVerticalStackTableViewCell", for: indexPath as IndexPath) as! NNPropertiesUnderProjectTableViewCell
    }
Run Code Online (Sandbox Code Playgroud)

但是,我得到了例外:

Could not cast value of type 'NNVerticalStackTableViewCell' (0x100945878) to 'NNPropertiesUnderProjectTableViewCell' (0x100949330).
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议如何解决问题.我想使用单一.xib,不想重复代码.

Tj3*_*j3n 5

但是,您可以UITableViewCell使用类似的,而不是使用UIView

为单元格内容视图创建一个xib,给它一个类(如CellView).在每个单元类中,获取CellViewwith loadNibNamed并将其设置为单元格内容视图,然后您可以自由更改其属性CellView并将其用作其他单元类的内容视图

也许有更好的解决方案,但这就是我为类似的外观做的方式UIViewController,你也可以在故事板中尝试没有类设置的单元格xib并尝试加载它并查看错误是否仍然存在