2015-09-14 77 views
4

我在故事板創建視圖控制器,我使用子類的ViewController從故事板

instantiateViewControllerWithIdentifier: 

加載它。但我需要將此VC作爲基類,並使用3-4個子類來更改其屬性。

如何獲得我的子類instantiateViewControllerWithIdentifier的實例?

+0

這是你的[答案](http://stackoverflow.com/questions/28022258/ios-present-viewcontroller-getting-black-screen/ 28022449#28022449)! – Kampai

回答

-1

只需投它。

MyController *controller = (MyController *)[self.storyboard instantiateViewControllerWithIdentifier:@"myController"]; 

或斯威夫特:

let controller = storyboard?.instantiateViewControllerWithIdentifier("myController") as! MyController 
+0

但是如果我需要創建MyControllerSubclass1 MyController的子類從故事板ID爲「myController」? –

+0

無論您給故事板中的視圖控制器添加了什麼ID。 –

+0

不,在這種情況下不起作用,您會得到一個運行時錯誤:'無法將類型'YourApp.BaseViewController'(0x10e435d48)的值轉換爲'YourApp.SubclassViewController'(0x10e435a68).' –

2

你將不得不使用對象的C運行時。覆蓋你的子類的初始化方法。使用'instantiateViewControllerWithIdentifier'創建一個BaseViewController對象。然後使用objc_setClass方法爲創建的對象設置類。 以下代碼將進入SubclassViewController.m。

- (instancetype)init { 
     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"main" bundle:[NSBundle mainBundle]]; 
     UIViewController *baseClassViewController = [storyboard instantiateViewControllerWithIdentifier:@"baseClassIdentifier"]; 

     object_setClass(baseClassViewController, [SubclassViewController class]); 
     return (SubclassViewController *)baseClassViewController; 
    } 

之後,您可以簡單地使用簡單的[[SubclassViewController alloc] init]創建SubclassViewController對象。

+0

不幸的是,這種崩潰如果子類包含任何額外的實例變量。這是因爲'object_setClass'只是改變'isa'指針。它沒有分配任何額外的空間。只要你嘗試訪問一個額外的變量,繁榮。 –

1

@Bhagyesh版本斯威夫特3

class func instantiateFromSuperclassStoryboard() -> SubclassViewController { 
    let stroryboard = UIStoryboard(name: "Main", bundle: nil) 
    let controller = stroryboard.instantiateViewController(withIdentifier: "BaseViewController") 
    object_setClass(controller, SubclassViewController.self) 

    return controller as! SubclassViewController 
} 
相關問題