3 回答

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
看一看的文檔進(jìn)行-[UIStoryboard instantiateViewControllerWithIdentifier:]。這使您可以使用在IB屬性檢查器中設(shè)置的標(biāo)識(shí)符從情節(jié)提要中實(shí)例化視圖控制器:
編輯以添加示例代碼:
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
MyViewController *controller = (MyViewController*)[mainStoryboard
instantiateViewControllerWithIdentifier: @"<Controller ID>"];

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
如果使用XCode5,則應(yīng)以其他方式進(jìn)行。
選擇你UIViewController的UIStoryboard
轉(zhuǎn)到Identity Inspector右上方窗格中的
選中Use Storyboard ID復(fù)選框
在Storyboard ID字段中寫(xiě)入唯一的ID
然后編寫(xiě)您的代碼。
// Override point for customization after application launch.
if (<your implementation>) {
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main"
bundle: nil];
YourViewController *yourController = (YourViewController *)[mainStoryboard
instantiateViewControllerWithIdentifier:@"YourViewControllerID"];
self.window.rootViewController = yourController;
}
return YES;

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
通常,系統(tǒng)應(yīng)使用情節(jié)提要處理視圖控制器實(shí)例化。您想要的是通過(guò)獲取對(duì)的引用來(lái)遍歷viewController層次結(jié)構(gòu),self.window.rootViewController而不是初始化視圖控制器,如果正確設(shè)置了故事板,則應(yīng)該已經(jīng)正確初始化了。
因此,假設(shè)您rootViewController是一個(gè)UINavigationController,然后要向其頂部視圖控制器發(fā)送內(nèi)容,則可以在AppDelegate的控件中執(zhí)行以下操作didFinishLaunchingWithOptions:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
在Swift中,如果非常相似:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
除非您要繞過(guò)加載故事板的常規(guī)方法并自己加載整個(gè)故事板,否則您實(shí)際上不應(yīng)該使用應(yīng)用程序委托中的故事板ID初始化視圖控制器。如果必須從AppDelegate初始化場(chǎng)景,則很可能是在做一些錯(cuò)誤的事情。我的意思是想象一下,由于某種原因,您想將數(shù)據(jù)發(fā)送到堆棧中的視圖控制器,AppDelegate不應(yīng)進(jìn)入視圖控制器堆棧以設(shè)置數(shù)據(jù)。那不是它的事。它的業(yè)務(wù)是rootViewController。讓rootViewController處理自己的孩子!因此,如果我通過(guò)在info.plist文件中刪除對(duì)其進(jìn)行的引用來(lái)繞過(guò)系統(tǒng)正常的情節(jié)提要加載過(guò)程,則最多使用以下方法實(shí)例化rootViewController:instantiateViewControllerWithIdentifier:,如果是容器,例如UINavigationController,則可能是其根。您要避免的是實(shí)例化已由情節(jié)提要實(shí)例化的視圖控制器。我看到的這個(gè)問(wèn)題很多。簡(jiǎn)而言之,我不同意接受的答案。除非張貼者打算從info.plist中刪除故事板的加載,否則這是不正確的,因?yàn)榉駝t您將加載2個(gè)故事板,這是沒(méi)有意義的??赡懿皇莾?nèi)存泄漏,因?yàn)橄到y(tǒng)初始化了根場(chǎng)景并將其分配給窗口,但是隨后您又來(lái)實(shí)例化它并再次分配它。您的應(yīng)用程序開(kāi)局非常糟糕!
- 3 回答
- 0 關(guān)注
- 738 瀏覽
添加回答
舉報(bào)