2015-10-06 50 views
1

我有一個第三方UIViewController,它只能用 - (id)initWithURL:(NSURL*)url進行初始化。沒有其他init - 家庭方法宣佈。我想將此子類用於Storyboard,因此可以自動調用類似[super initWithURL:[NSURL URLWithString:@"about:blank"]]的東西。拋開設計模式,這只是目標。子類awakeFromNib調用超類的自定義init/setup方法?

我已經試過這在子無果:以上

- (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; 
} 

所以我試着打電話給[super performSelector:@selector(setup)]awakeFromNib,當然私有變量_url不能從子類進行設置。我怎樣才能完成這個故事板的使用?

回答

1

您將需要覆蓋UIViewController子類中的initWithCoder: init方法。這樣,您可以在創建UIViewController時返回不同的實例。

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

一些額外的閱讀對象是如何從故事板初始化:Responding to Being Loaded from a Nib File

+0

就是這樣。寫得很好。我從來沒有使用'initWithCoder',也沒有使用過很多故事板。謝謝。 – Chan