0

我有一個UIViewController,它是在故事板中創建的,並且已分配故事板ID。這個UIViewController在代碼中的不同位置被實例化,因此從所有不同的位置創建segse是沒有意義的。在故事板中創建自定義UINavigationController不是實例化視圖

視圖控制器需要包含在UINavigationController中才能正常工作,因爲它使用各種導航欄項目並可以推送其他視圖控制器。

// some where in code that needs to present the custom view controller 

UIViewController *viewControllerToPresent = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; 

[self.viewController presentViewController: viewControllerToPresent animated:YES]; 

問題是,視圖控制器不包含在導航控制器從故事板預期:

視圖控制器從代碼如下實例化。我已經試過含分配UINavigationController的故事板ID的,但造成的prepareForSegue現有代碼的問題其預期的CustomViewController

顯而易見的選擇一個實例來解決,這將是呈現CustomViewController前添加一個UINavigationController的創作:

UIViewController *viewControllerToPresent = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; 
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController: viewControllerToPresent]; 
[self.viewController presentViewController: nav animated:YES]; 

但是,這並不能解決問題,因爲故事板中的導航項目沒有正確添加。

對我來說似乎更合理的是,CustomViewController繼承自UINavigationController並在storyboard中構建整個事物,以使自定義視圖控制器包含自己的導航欄。

我見過類如UIImagePickerControllerUINavigationController繼承,我相信正是這種情況下,他們試圖解決。

問題是,當我更改CustomViewController從UINavigationController繼承,當從故事板ID實例化視圖控制器時,視圖返回空。故事板根本不構建視圖。

這是可以修復的東西嗎?

回答

0

您應該在故事板中創建UINavigationController並將其連接到您的UIViewController。

然後,實例化和呈現的UINavigationController:

的UINavigationController * NAV = [self.storyboard instantiateViewControllerWithIdentifier:@ 「MyNavigationController」];

[self.viewController presentViewController:nav animated:YES];

您的UIViewController將自動加載,因爲它已連接到StoryBoard中。在Storyboard中預定義的所有按鈕和配置都將加載。

0

你沒有描述你的情況非常清楚。

如果要將視圖控制器推到導航堆棧上,則必須在屏幕上顯示導航控制器。

您可以設置一個故事板,其中根視圖控制器是UINavigationController的自定義子類。這工作正常。然後,您可以使用您發佈的代碼實例化新的視圖控制器,並將它們推送到導航控制器的導航堆棧上。用於推動一個視圖控制器到導航堆棧的方法是

pushViewController:animated:

然而,正在使用的呼叫,presentViewController:動畫:,是棄用方法以呈現模態視圖控制器,而不是推查看控制器到導航控制器堆棧上。

(該方法的新版本是提出一種模態視圖控制器presentViewController:animated:completion:

你的代碼第二塊是沒有更好:

UIViewController *viewControllerToPresent = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; 
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController: viewControllerToPresent]; 
[self.viewController presentViewController: nav animated:YES]; 

即代碼創建導航控制器,然後忽略它仍然試圖將viewControllerToPresent作爲self.viewController之上的模式呈現,不管它是什麼。

將視圖控制器推到導航控制器堆棧上的方法是 pushViewController:animated :.您將該消息發送給導航控制器,但導航控制器必須在屏幕上才能執行任何操作。

這裏是我建議你做:

選擇故事板的初始視圖控制器。從編輯器菜單中選擇「嵌入>導航控制器」。這將創建一個新的空白導航控制器,並使其成爲故事板的初始視圖控制器。

相關問題