2015-02-11 6 views
6

के साथ रूटव्यू कंट्रोलर सेट करना मेरे पास एक नेविगेशन कंट्रोलर और एक डिफ़ॉल्ट रूटव्यू कंट्रोलर वाला प्रोग्राम है। मैं प्रोग्राम के रूप में कुछ नहीं करते हैं, एप्लिकेशन लॉन्च होने और RootViewController ऐसी क्या स्टोरीबोर्ड नीचे दर्शाता है के रूप में के रूप में मैं उम्मीद काम करता है,:UINavigationController प्रोग्रामेटिक

enter image description here

मुद्दा रहा है कि वैकल्पिक प्रारंभ ViewController को शामिल करके है। क्या मैं चाहता हूँ यह है: मेरे AppDelegate (didFinishLaunchingWithOptions) में, मैं इस तरह कोड करना चाहते हैं:

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

पहले वैकल्पिक प्रारंभ ViewController दिखाने के लिए। फिर, उपयोगकर्ता वैकल्पिक व्यू कंट्रोलर के साथ समाप्त होने के बाद, वे रूटव्यू कंट्रोलर प्रदर्शित कर सकते हैं।

इस तरह तो वैकल्पिक प्रारंभ ViewController में, मैं जोड़ दिया है कोड रूट देखें नियंत्रक को दिखाने के लिए:

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

यह सब काम करता है RootViewController को छोड़कर, जब दिखाया गया है, नहीं है नेविगेशन नियंत्रण अपेक्षित के रूप में (यानी दृश्य नेविगेशन नियंत्रण के बिना दिखाया गया है)।

मैं भी एक ही परिणाम के साथ नीचे कोड (ViewController के बजाय UINavigationController का उपयोग करके) की कोशिश की है ...

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

एक अन्य मोड़ ... वहाँ कई वैकल्पिक शुरू दृश्य नियंत्रक हो सकता है।

कोई विचार?

+0

तो समस्या यह है कि है Naviga टयन बार नहीं है? – gabbler

+0

'UIViewController' (रूट व्यू कंट्रोलर) के बजाय 'UINavigationController' के पहचानकर्ता का उपयोग करें। – n00bProgrammer

+0

मैंने अभी मूल प्रश्न को प्रतिबिंबित करने के लिए संपादित किया ... – Adam

उत्तर

4
  1. हटाएँ UINavigationController
  2. नियंत्रक ("वैकल्पिक शुरू दृश्य नियंत्रक" हमारे मामले में)
  3. क्लिक Editor >> Embed In >> Navigation Controller
  4. अब Navigation Controller और दाईं ओर उपयोगिता क्षेत्र का चयन करें का चयन करें, विकल्प का चयन करें Is Initial View Controller

यदि आप रूट व्यू कंट्रोलर को गतिशील रूप से बदलना चाहते हैं तो इसे प्रोग्रामेटिक रूप से करने के लिए बेहतर है,में, विंडो इंस्टेंस प्राप्त करें, रूट व्यू कंट्रोलर के साथ नेविगेशन कंट्रोलर प्रारंभ करें और फिर नेविगेशन नियंत्रक के लिए विंडोज रूट व्यू कंट्रोलर सेट करें। यहां कोड है।

- (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; 
} 

और सुनिश्चित करें कि आप कहानी बोर्ड में सभी दृश्य नियंत्रकों के लिए Is Initial View Controller सही का निशान हटाएँ

आशा इस मदद करता है

+0

क्या होगा अगर एक से अधिक वैकल्पिक प्रारंभ दृश्य नियंत्रक हैं? – Adam

+0

पूरा समाधान @Adam देखें – Saif

0

आप UINavigationController में नया रूट दृश्य नियंत्रक सेट नहीं कर सकता के बाद यह initialised किया गया है। आपको अपनी आवश्यकताओं के अनुसार viewControllers सरणी UINavigationController संशोधित करना चाहिए।

यदि आप वैकल्पिक वीसी रूट वीसी होना चाहते हैं, तो @[optionalVC] बनाएं और इसे viewControllersUINavigationController के सरणी के रूप में सेट करें।

1

स्टोरीबोर्ड का उपयोग किए बिना हम 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]; 

में स्विफ्ट संस्करण

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() 
संबंधित मुद्दे