我需要有一些看起来非常相似但有不同行为的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文件,并有自己的添加和行为。
答案 0 :(得分:14)
如果您只有父类的xib(但没有子类),您可以在子类init中执行此操作:
- (instancetype) init {
if (self = [super initWithNibName:@"ParentViewController" bundle:nil]) {
// init stuff for subclass
}
return self;
}
这是一个示例项目:
答案 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。