子类化具有xib的子类UIViewController

时间:2014-12-06 21:26:11

标签: ios uiviewcontroller xcode6 subclass 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和子UIViewControllers。

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

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

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

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

2 个答案:

答案 0 :(得分:14)

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

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

这是一个示例项目:

https://github.com/annabd351/SubClassFromParentNib

答案 1 :(得分:1)

如果有人正在寻找Swift解决方案,则可以在子类上使用便捷初始化程序,并使用超类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。