2015-02-11 20 views
6

Mam program z kontrolerem nawigacyjnym i domyślnym kontrolerem RootViewController. Gdybym nic zrobić programowo, aplikacja uruchomi się i RootViewController działa jak oczekuję, takich jak to, co poniżej storyboard oznacza:Ustawianie RootViewController z UINavigationController Programowo

enter image description here

problem, który mam jest przez wprowadzenie opcjonalnego Rozpocznij ViewController. Czego chcę to: Moim AppDelegate (didFinishLaunchingWithOptions), chcę mieć kod jak poniżej:

UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"OptionalStartViewController"]; 
self.window.rootViewController = viewController; 
[self.window makeKeyAndVisible]; 

Aby najpierw pokazać Opcjonalne Rozpocznij ViewController. Następnie, po zakończeniu przez użytkownika opcjonalnego kontrolera viewcontroller, mogą one następnie wyświetlić RootViewController.

Więc w opcjonalnym start ViewController dodałem kod tak, aby pokazać Korzeń Zobacz Kontroler:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil]; 
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"RootViewController"]; 
[self appDelegate].window.rootViewController = viewController; 
[[self appDelegate].window makeKeyAndVisible]; 

To wszystko działa wyjątkiem RootViewController, gdy widać, nie ma Sterowanie nawigacją zgodnie z oczekiwaniami (tzn. widok jest wyświetlany bez elementów sterujących nawigacji).

Ja również próbowałem poniższy kod (używając UINavigationController zamiast ViewController) z tymi samymi wynikami ...

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil]; 
UINavigationController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; 
[self appDelegate].window.rootViewController = viewController; 
[[self appDelegate].window makeKeyAndVisible]; 

jeden inny skręt ... nie mogło być kilka opcjonalnych kontrolerów widoku początek.

Wszelkie pomysły?

+0

Tak więc problem jest taki, że NAVIGA pasek nie ma? – gabbler

+0

Użyj identyfikatora 'UINavigationController' zamiast' UIViewController' (kontroler widoku root). – n00bProgrammer

+0

Właśnie zredagowałem oryginalne pytanie, aby odzwierciedlić ... – Adam

Odpowiedz

4
  1. Usunięcie UINavigationController
  2. wybrać kontroler ("opcjonalny kontroler widok start" w naszym przypadku)
  3. kliknięcie Editor >> Embed In >> Navigation Controller
  4. Teraz zaznacz obszar Navigation Controller i prawy bok Utility wybierz opcję Is Initial View Controller

Jeśli chcesz zmienić dynamicznie kontroler widoku root, to lepiej, aby programowo to zrobił, w didFinishLaunchingWithOptions, Pobierz instancję okna, zainicjuj kontroler nawigacyjny za pomocą kontrolera widoku głównego, a następnie ustaw kontroler widoku głównego systemu Windows na kontroler nawigacyjny. Oto kod.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
// Override point for customization after application launch. 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

    OptionalFirstViewController *optionalFirstViewController = [[OptionalFirstViewController alloc] initWithNibName:@"OptionalFirstViewController" bundle:nil]; 
    UINavigationController *homeNavigationController = [[UINavigationController alloc] initWithRootViewController:optionalFirstViewController]; 
    [optionalFirstViewController release]; 
    self.window.rootViewController = homeNavigationController; 
    [homeNavigationController release]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

i upewnij się, że zaznaczenie Is Initial View Controller dla wszystkich kontrolerów widoku w scenorys

Hope this helps

+0

Co się stanie, jeśli istnieje więcej niż jeden opcjonalny kontroler widoku początkowego? – Adam

+0

Zobacz kompletne rozwiązanie @Adam – Saif

0

Nie można ustawić nowy kontroler widoku root UINavigationController po jest inicjowany. Należy zmodyfikować tablicę viewControllers z UINavigationController zgodnie z potrzebami.

Jeśli chcesz, aby opcjonalny VC był root VC, utwórz @[optionalVC] i ustaw go jako viewControllers array of UINavigationController.

1

Bez użycia storyboardu możemy ustawić programowo w klasie AppDelegate, po prostu zapisz te linie kodu w AppDelegate.

AppDelegate.h

@property (strong, nonatomic) UIStoryboard *storyboard; 
@property (strong, nonatomic) UINavigationController *navigationController; 

AppDelegate.m

if(self.window == nil) 
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 

if(self.navigationController == nil) 
    self.navigationController = [[UINavigationController alloc]init]; 

if(self.storyboard == nil) 
    self.storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 

self.navigationController.navigationBarHidden = YES; 

// Here we can check user is login or not also, 

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
ViewController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; 
[self.navigationController pushViewController:ivc animated:YES]; 
self.window.rootViewController = ivc; 


[self.window setRootViewController:self.navigationController]; 
[self.window makeKeyAndVisible]; 

W Swift Wersja

var window: UIWindow? 
var storyBoard :UIStoryboard? 
var navigationController : UINavigationController? 
var mainController :MainViewController = MainViewController() 

if window == nil { 
     window = UIWindow(frame: UIScreen.main.bounds) 
    } 
    if navigationController == nil { 
     navigationController = UINavigationController() 
    } 
    if storyBoard == nil { 
     storyBoard = UIStoryboard(name: "Main", bundle:nil) 
    } 
    navigationController?.setNavigationBarHidden(true, animated: true) 
    // storyboard with identifer 
    mainController = storyBoard?.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController 
    navigationController?.pushViewController(mainController , animated: true) 

    window?.rootViewController = navigationController 
    window?.makeKeyAndVisible() 
Powiązane problemy