我在故事板創建視圖控制器,我使用子類的ViewController從故事板
instantiateViewControllerWithIdentifier:
加載它。但我需要將此VC作爲基類,並使用3-4個子類來更改其屬性。
如何獲得我的子類instantiateViewControllerWithIdentifier
的實例?
我在故事板創建視圖控制器,我使用子類的ViewController從故事板
instantiateViewControllerWithIdentifier:
加載它。但我需要將此VC作爲基類,並使用3-4個子類來更改其屬性。
如何獲得我的子類instantiateViewControllerWithIdentifier
的實例?
只需投它。
MyController *controller = (MyController *)[self.storyboard instantiateViewControllerWithIdentifier:@"myController"];
或斯威夫特:
let controller = storyboard?.instantiateViewControllerWithIdentifier("myController") as! MyController
但是如果我需要創建MyControllerSubclass1 MyController的子類從故事板ID爲「myController」? –
無論您給故事板中的視圖控制器添加了什麼ID。 –
不,在這種情況下不起作用,您會得到一個運行時錯誤:'無法將類型'YourApp.BaseViewController'(0x10e435d48)的值轉換爲'YourApp.SubclassViewController'(0x10e435a68).' –
你將不得不使用對象的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對象。
不幸的是,這種崩潰如果子類包含任何額外的實例變量。這是因爲'object_setClass'只是改變'isa'指針。它沒有分配任何額外的空間。只要你嘗試訪問一個額外的變量,繁榮。 –
@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
}
這是你的[答案](http://stackoverflow.com/questions/28022258/ios-present-viewcontroller-getting-black-screen/ 28022449#28022449)! – Kampai