繁体   English   中英

子类化具有xib的子类UIViewController

[英]Subclassing a subclassed UIViewController that has a xib

我需要有一些看起来非常相似但有不同行为的UIViewControllers,所以我想我会用xib创建一个通用的UIViewController子类,然后在我需要的时候将它子类化,对于那些看起来相似的不同的UIViewController。

我正在努力实现以下目标

UIViewController子类(有一个xib文件关联) - >并且能够将它子类化为我想要的次数(没有为子节点添加额外的xib文件)

到目前为止我做了什么:

xib文件表示具有多个UI元素的UIViewController。

我已将所有连接设置为文件所有者@ xib文件。

带有xib的子类包含这个@ init方法:

self = [[[NSBundle mainBundle] loadNibNamed:
                 [NSString stringWithFormat:@"ParentViewController"]
                                              owner:self options:nil] objectAtIndex:0];

当我将xib中的View属性连接到文件的所有者时,我得到一个异常,说我不能将View属性连接到父和子UIViewControllers。

但是当View属性仅连接到与xib相关联的UIViewController时,我得到一个空白屏幕,并且该插座不可断开。

如果我实例化父vc而不是子进程,一切正常,如果一切都是以编程方式完成而不是使用xib,那么一切正常。

因为这个UIViewController显示了很多UI元素,所以我试图用xib设置它。

我真的不明白如何让孩子ViewControllers看起来像父的xib文件,并有自己的添加和行为。

如果您只有父类的xib(但没有子类),您可以在子类init中执行此操作:

- (instancetype) init {
    if (self = [super initWithNibName:@"ParentViewController" bundle:nil]) {
      // init stuff for subclass
    }
    return self;
 }

这是一个示例项目:

https://github.com/annabd351/SubClassFromParentNib

如果有人正在寻找Swift解决方案,您可以在子类上使用Convenience初始化器并使用超类xib对其进行初始化。

在您的子类中,使用便捷初始化程序:

class ChildController: BaseViewController {

    convenience init() {
        self.init(nibName: "BaseViewControllerXib", bundle: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

然后在创建子类对象时使用。

let childViewController = ChildController()
navigationController.pushViewController(childViewController, animated: true)

这样您就可以使用父viewController中的xib。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM