2013-04-25 5 views
55

के अलावा अन्य विधि द्वारा UINavigationController के rootViewController को सेट करें initWithRootViewController के अलावा किसी अन्य विधि से rootViewControllerUINavigationController कैसे सेट करें?initWithRootViewController

मैं अपने नेविगेशन नियंत्रक के लिए एक कस्टम टूलबार वितरित करने के लिए initWithNavigationBarClass:toolbarClass: का उपयोग करना चाहता हूं, इसलिए मुझे नहीं लगता कि मैं initWithRootViewController का उपयोग कर सकता हूं।

+0

एक दृष्टिकोण मैं बस की खोज की है है: [navigationController setViewControllers [ NSArray arrayWithObject: (नियंत्रक को देखने के लिए सूचक जो मूल दृश्य नियंत्रक होना चाहिए)]]; क्या यह सबसे अच्छा तरीका है? मुझे लगता है कि आपको इसे केवल FinishLaunching प्रतिनिधि विधि पर AppDelegate फ़ाइल में कॉल करना चाहिए, क्योंकि यह – drc

उत्तर

110

आप इसे setViewControllers पर कॉल करके हल कर सकते हैं।

इस तरह

: स्विफ्ट का उपयोग

UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:[UIToolbar class]]; 

[navigationController setViewControllers:@[yourRootViewController] animated:NO]; 
+0

के बाद UINavigationController के दृश्य नियंत्रक सरणी के साथ जोखिम भरा गड़बड़ लगता है। इसे एक अलग प्रश्न में जाने की आवश्यकता हो सकती है लेकिन मैं initWithNav मानता हूं .. इसका मतलब है कि मेरे सभी टूलबार में वही उपस्थिति होगी जो मैंने कस्टम उपclass में सेट की है। फिर मेरे ऐप के विभिन्न वर्गों के लिए अलग-अलग स्टाइल टूलबार कैसे हैं? क्या मैं उस कस्टम सबक्लास से अलग टूलबार लौटाता हूं? या क्या एक बेहतर दृष्टिकोण है? – drc

+0

इसके लिए आप 'navigationController.navigationBar.tintColor = [UIColor BlackColor] का उपयोग कर सकते हैं; या फिर आप इसे '- (शून्य) दृश्य में डालना चाहते हैंडिएडएपियर: एनिमेटेड:' आपके व्यू कंट्रोलर के तरीके –

+0

तो यह इस तथ्य को ओवरराइड करेगा मेरे UIToolBar सबक्लास में मैं drawRect ओवरराइड कर रहा हूं और कस्टम पृष्ठभूमि सेट कर रहा हूं? इस प्रकार मैं इसे कार्यान्वित करता हूं: UIImage * backgroundImage = [UIImage imageNamed: @ "UIToolBar_Background.png"]; [backgroundImage drawInRect: CGRectMake (0, 0, self.frame.size.width, self.frame.size.height)]; – drc

16

ज्ञान शेयरिंग:

अन्य वर्ग से रूट दृश्य नियंत्रक बदलने एप्लिकेशन delegate.swift से

let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
var homeViewController = mainStoryboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController 
let nav = UINavigationController(rootViewController: homeViewController) 
appdelegate.window!.rootViewController = nav 

आशा इस वसीयत किसी के लिए उपयोगी ।

संपादित: के साथ एनीमेशन के साथ

बदलने rootviewcontroller को प्राप्त किया जा सकता है:

UIView.transitionWithView(self.window!, duration: 0.5, options: UIViewAnimationOptions.TransitionFlipFromLeft, animations: { 
    self.window?.rootViewController = anyViewController 
}, completion: nil) 

हम भी this.

+0

हाय @ अरविंद, क्या आप मुझे यह कोड रखने के लिए सबसे अच्छी जगह बता सकते हैं? क्या यह AppDelegate.swift के शीर्ष पर होना चाहिए ताकि चर वैश्विक रूप से उपलब्ध हों? या शायद इसे किसी वर्ग के भीतर कहीं भी होना चाहिए क्योंकि यह तत्काल विचार है? धन्यवाद – FireDragon

+0

हां, आप func एप्लिकेशन (एप्लिकेशन: यूआईएप्लिकेशंस, didFinishLaunchingWithOptions लॉन्चऑप्शन: [NSObject: AnyObject]?) -> बूल पर उपयोग कर सकते हैं। आप किसी भी दृश्य नियंत्रक पर कर सकते हैं। जब आप लॉगआउट के लिए पूछते हैं तो आपको आवश्यकता हो सकती है। – Arvind

+0

@ अरविंद एनीमेशन से कैसे निपटें? कोई एनीमेशन नहीं दिखाया गया है और rootView तुरंत दिखाया गया है। – Engnyl

0
let storyboard = UIStoryboard(name: "Main", bundle: nil)   
    let yourNewRootView = storyboard.instantiateViewControllerWithIdentifier("yourNewRootView") as? yourNewRootView 


    self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 

    UIView.transitionWithView(self.window!, duration: 0.1, options: [UIViewAnimationOptions.TransitionFlipFromRight,UIViewAnimationOptions.TransitionFlipFromLeft], animations: 
    { 
     // animation 

     }, completion: { (finished: Bool) ->() in 

      self.window?.rootViewController = nil 
      self.window?.rootViewController = yourNewRootView 
      self.window?.makeKeyAndVisible() 
    }) 
7

मेरे लिए यह एक काम करता है के लिए इसी तरह विधि सामान्यीकरण लिख सकते हैं, यह उम्मीद है कि आपकी मदद करता है,

let rootVC:LoginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as! LoginViewController 
let nvc:UINavigationController = self.storyboard?.instantiateViewControllerWithIdentifier("RootNavigationController") as! UINavigationController 
nvc.viewControllers = [rootVC] 
UIApplication.sharedApplication().keyWindow?.rootViewController = nvc 
+1

पर शून्य हो रही है आपने अपना दिन बचाया! – atom2ueki

+1

केवल एक ही काम करता है! – Marin

+0

धन्यवाद @ atom2ueki –

1

तेज 3.0 xcode8.1

सामान्य सेटिंग्स मुख्य इंटरफ़ेस में हटाने में

में: मुख्य < -इस मुख्य इंटरफ़ेस के बाद:

class AppDelegate... 

var window: UIWindow? 

    fun application... 

     window = UIWindow(frame: UIScreen.main.bounds) 
     window?.makeKeyAndVisible() 
     window?.rootViewController = UINavigationController(rootViewController: NewYourController)