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

时间:2016-11-09 07:03:07

标签: ios swift uitableview xib

我正面临一个问题

我有一个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)
        }
    }
}

NNVerticalStackTableViewCell.xib文件的接口

enter image description here

class name为:NNVerticalStackTableViewCellcell identifier为: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)
    }
}

现在我要做的是使用带有NNPropertiesUnderProjectTableViewCell接口的NNVerticalStackTableViewCell.xib类。

NNPropertiesUnderProjectTableViewCell类似,我有许多其他类使用与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
    }

但是,我得到了例外:

Could not cast value of type 'NNVerticalStackTableViewCell' (0x100945878) to 'NNPropertiesUnderProjectTableViewCell' (0x100949330).

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

5 个答案:

答案 0 :(得分:5)

您可以使用类似的UITableViewCell

,而不是使用UIView

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

也许有更好的解决方案,但这就是我为类似的UIViewController做的,你也可以在storyboard中尝试没有类设置的单元xib并尝试加载它,看看错误是否仍然存在< / p>

答案 1 :(得分:3)

您不能这样做,因为registerNib:期望与确切注册的视图相同的实例。

您可以在此处复制NNVerticalStackTableViewCell.xib并保留NNVerticalStackTableViewCell.swift作为您的基类。

然后创建类似NNPropertiesUnderProjectTableViewCell.xib的内容,其中包含与NNVerticalStackTableViewCell.xib之前完全相同的视图以及添加的控件。然后使用唯一标识符NNPropertiesUnderProjectTableViewCell.swift将其子类化为NNPropertiesUnderProjectTableViewCell

其中NNPropertiesUnderProjectTableViewCellNNVerticalStackTableViewCell的子类。

从这里开始,只需添加NNPropertiesUnderProjectTableViewCell类唯一的附加控件。

答案 2 :(得分:2)

如果要在多个时间内使用tableViewCell.xib,可以这样做。 首先转到文件并创建新文件(Cocoa Touch Class)。

CocoaTouch Class

使用.xib创建TableViewCell文件

TableViewCell

现在简单创建自定义单元格设计

Design

现在在File TableViewCell.swift中添加此代码

Image

现在只需在tableView Cell中添加标识符(如果要添加此自定义TableviewCell)

cell

现在把它当作你的手机就像这样......

Table

宾果你明白了..

现在只需将单元格添加为!任何TableViewController文件中的TableViewCell(您使用相同的设计获得相同的结果。)

OutPut1

Click First(加载第一个TableViewController)

FirstTable

单击第二个(加载第二个TableViewController)

SecondTable View

答案 3 :(得分:1)

基本上,你不能完全按照你要做的那样做,因为类名在XIB中,所以你总是得到基类的实例,而不是你的任何子类。

来自@ Tj3n的建议很好,将公共部分提取到可重用的视图中,并在您的超类初始化中创建该视图的实例并添加它。现在,当您实例化一个子类并且它调用super时,公共元素将被子类初始化和使用。

换句话说,使用组合来实现目标,而不是继承。

答案 4 :(得分:0)

NNPropertiesUnderProjectTableViewCell未注册Cellidentifier。