我有一个第 3 方 UIViewController
,它被设计为仅使用 -(id)initWithURL:(NSURL*)url
进行初始化。没有声明其他 init
系列方法。我想将其子类化以与 Storyboard 一起使用,因此会自动调用 [super initWithURL:[NSURL URLWithString:@"about:blank"]]
之类的东西。撇开设计模式不谈,这只是大谈特谈的目标。
我已经在子类中试过了,但没有用:
- (void)awakeFromNib {
[super awakeFromNib];
if ([super respondsToSelector:@selector(initWithUrl:)]) {
[super performSelector:@selector(initWithUrl:) withObject:[NSURL URLWithString:@"about:blank"]];
}
}
上面给出了关于保留对象的选择器的编译器错误。现在,父类(super class)initWithURL:
就是这个
- (id)initWithUrl:(NSURL *)url {
// Set url and init views
_url = url;
[self setup];
return self;
}
所以我尝试从awakeFromNib
调用[super performSelector:@selector(setup)]
,当然不能从子类设置私有(private)变量_url .我怎样才能完成这个以供 Storyboard 使用?
最佳答案
您需要覆盖 UIViewController 子类中的 initWithCoder:
init 方法。这样您就可以在创建 UIViewController 时返回不同的实例。
- (instancetype)initWithCoder:(NSCoder *)decoder
{
self = [super initWithURL:[NSURL URLWithString:@"about:blank"]];
return self;
}
一些关于如何从 Storyboard初始化对象的额外阅读:Responding to Being Loaded from a Nib File
关于ios - 子类 awakeFromNib 调用父类(super class)自定义 init/setup 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32960542/