亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

故事板-請參閱AppDelegate中的ViewController

故事板-請參閱AppDelegate中的ViewController

catspeake 2019-10-24 14:25:39
請考慮以下情形:我有一個基于情節提要的應用程序。我將一個ViewController對象添加到情節提要中,將此ViewController的類文件添加到項目中,并在IB身份檢查器中指定新類的名稱?,F在,我該如何從AppDelegate以編程方式引用此ViewController?我已經在相關類中創建了一個變量,并將其轉換為IBOutlet屬性,但是我看不到任何能夠在代碼中引用新ViewController的方法-嘗試ctrl拖動連接不起作用。即在AppDelegate中,我可以像這樣進入基本的ViewController(MyViewController*) self.window.rootViewController但是情節提要中包含的其他ViewController怎么樣?
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

看一看的文檔進行-[UIStoryboard instantiateViewControllerWithIdentifier:]。這使您可以使用在IB屬性檢查器中設置的標識符從情節提要中實例化視圖控制器:

編輯以添加示例代碼:


UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"

                                                         bundle: nil];


MyViewController *controller = (MyViewController*)[mainStoryboard 

                    instantiateViewControllerWithIdentifier: @"<Controller ID>"];



查看完整回答
反對 回復 2019-10-24
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

如果使用XCode5,則應以其他方式進行。


選擇你UIViewController的UIStoryboard

轉到Identity Inspector右上方窗格中的

選中Use Storyboard ID復選框

在Storyboard ID字段中寫入唯一的ID

然后編寫您的代碼。


// 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;


查看完整回答
反對 回復 2019-10-24
?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

通常,系統應使用情節提要處理視圖控制器實例化。您想要的是通過獲取對的引用來遍歷viewController層次結構,self.window.rootViewController而不是初始化視圖控制器,如果正確設置了故事板,則應該已經正確初始化了。


因此,假設您rootViewController是一個UINavigationController,然后要向其頂部視圖控制器發送內容,則可以在AppDelegate的控件中執行以下操作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

除非您要繞過加載故事板的常規方法并自己加載整個故事板,否則您實際上不應該使用應用程序委托中的故事板ID初始化視圖控制器。如果必須從AppDelegate初始化場景,則很可能是在做一些錯誤的事情。我的意思是想象一下,由于某種原因,您想將數據發送到堆棧中的視圖控制器,AppDelegate不應進入視圖控制器堆棧以設置數據。那不是它的事。它的業務是rootViewController。讓rootViewController處理自己的孩子!因此,如果我通過在info.plist文件中刪除對其進行的引用來繞過系統正常的情節提要加載過程,則最多使用以下方法實例化rootViewController:instantiateViewControllerWithIdentifier:,如果是容器,例如UINavigationController,則可能是其根。您要避免的是實例化已由情節提要實例化的視圖控制器。我看到的這個問題很多。簡而言之,我不同意接受的答案。除非張貼者打算從info.plist中刪除故事板的加載,否則這是不正確的,因為否則您將加載2個故事板,這是沒有意義的??赡懿皇莾却嫘孤?,因為系統初始化了根場景并將其分配給窗口,但是隨后您又來實例化它并再次分配它。您的應用程序開局非常糟糕!


查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 729 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號