Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为不同的UITableViewCell类创建single.xib_Ios_Swift_Uitableview_Xib - Fatal编程技术网

Ios 为不同的UITableViewCell类创建single.xib

Ios 为不同的UITableViewCell类创建single.xib,ios,swift,uitableview,xib,Ios,Swift,Uitableview,Xib,我面临一个问题 我有一个NNVerticalStackTableViewCell.xib文件及其相应的NNVerticalStackTableViewCell.swift文件 NNVerticalStackTableViewCell.swift文件的代码 class NNVerticalStackTableViewCell: UITableViewCell { //MARK: Outlets @IBOutlet weak var titleLabel: UILabel!

我面临一个问题

我有一个
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文件的接口

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
单元格标识符
作为:
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)
    }
}
现在,我要做的是将
nnpropertiesUnprojectTableViewCell
类与
NNVerticalStackTableViewCell.xib
接口一起使用

类似于
NNPropertiesUnderProjectTableViewCell
class 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
    }
但是,我得到了一个例外:

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

谁能提出解决这个问题的建议吗。我想使用single
.xib,不想重复代码。

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

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


也许有更好的解决方案,但这就是我为类似外观的UIViewController所做的,您也可以尝试在故事板中不设置类的cell xib,并尝试加载它,看看错误是否仍然存在,你不能完全按照你想做的去做,因为类名在XIB中,所以你总是得到一个基类的实例,而不是你的任何子类

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


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

如果要多次使用tableViewCell.xib,可以这样做。 首先转到文件并创建新文件(Cocoa Touch类)

使用.xib创建TableViewCell文件

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

现在将此代码添加到文件TableViewCell.swift中

现在只需像这样在tableView单元格中添加标识符(您要在其中添加此自定义tableView单元格)

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

宾果,你明白了

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

单击第一(加载第一个TableViewController)的此处

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


您不能这样做,因为
注册表nb:
期望的是同一个已注册视图的实例

从这里,您可以复制
NNVerticalStackTableViewCell.xib
并将
NNVerticalStackTableViewCell.swift
保留为基类

然后创建类似于
nnpropertiesUnprojectTableViewCell.xib
的东西,在这里,它使用添加的控件保持与以前完全相同的视图
NNVerticalStackTableViewCell.xib
。然后将其子类化为
NNPropertiesUnderProjectTableViewCell.swift
,并使用唯一标识:
NNPropertiesUnderProjectTableViewCell

其中
NNPropertiesUnderProjectTableViewCell
NNVerticalStackTableViewCell
的子类


从这里开始,只需为
NNPropertiesUnderProjectTableViewCell
类添加您独有的附加控件。

您可以展示一个多个类使用同一个xib文件的示例吗?是的,我使用了相同的方法。但我希望有别的选择。