子类 awakeFromNib 调用超类自定义 init/setup 方法?

Subclass awakeFromNib to call a superclass custom init/setup method?

我有一个 3rd-party 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"]];
    }
}

上面给出了关于保留对象的选择器的编译器错误。现在,超类 initWithURL: 就是这个

- (id)initWithUrl:(NSURL *)url {
    // Set url and init views
    _url = url;
    [self setup];
    return self;
}

所以我尝试从awakeFromNib调用[super performSelector:@selector(setup)],但是当然不能从子类设置私有变量_url。我怎样才能完成这个以供 Storyboard 使用?

您需要覆盖 UIViewController 子类中的 initWithCoder: init 方法。这样您就可以在创建 UIViewController 时 return 一个不同的实例。

- (instancetype)initWithCoder:(NSCoder *)decoder
{
    self = [super initWithURL:[NSURL URLWithString:@"about:blank"]];
    return self;
}

一些关于如何从故事板初始化对象的额外阅读:Responding to Being Loaded from a Nib File