2012-04-19 15 views
17

मैं navigationController जो और जिसका rootviewcontroller कुछ बिंदु मैं मैंने किया SecondViewController.What को navigationController की rootviewcontroller बदलना चाहते FirstViewController.At कहना हैनेविगेशन नियंत्रक के रूटव्यू कंट्रोलर को कैसे बदला जाए?

[self.navigationController initWithRootViewController:SecondViewController]; 

है मुझे यकीन है कि नहीं कर रहा हूँ कि मैं क्या किया था सही है modalview के रूप में प्रस्तुत किया गया है और फर्स्ट व्यू कंट्रोलर जारी किया गया है या नहीं? कृपया किसी को यह जानने का सही तरीका क्या है?

अग्रिम धन्यवाद!

उत्तर

40

करो या तो

[firstViewController.navigationController setViewControllers: [NSArray arrayWithObject: secondViewController] 
                animated: YES]; 

या

firstViewController.navigationController.viewControllers = [NSArray arrayWithObject: secondViewController]; 

जहां firstViewControllerFirstViewController और secondViewController का एक उदाहरण है SecondViewController वर्गों का एक उदाहरण है, क्रमशः। बाद वाला संस्करण एनीमेशन के बिना setViewControllers:animated: के लिए एक शॉर्टकट है।

+0

धन्यवाद Costique बनाने की जरूरत है! यह काम कर रहा है। क्या आप कृपया बता सकते हैं कि setViewController कैसे काम करता है? –

+4

दोनों विधियां नेविगेशन नियंत्रक के अंदर पूरे दृश्य नियंत्रक ढेर को प्रतिस्थापित करती हैं। "पुराने" नियंत्रक जारी हो जाते हैं। स्टैक सरणी रूट नियंत्रक के साथ शुरू होती है और इसका अंतिम तत्व शीर्षतम नियंत्रक है। – Costique

+0

@ कोस्टिक मैं रूट कैसे सेट कर सकता हूं ... मान लीजिए मुझे रूट को 3 बार बदलना है, तो क्या यह विधियां कुशलता से काम करती हैं या नहीं? – Dalvik

0

यह सही तरीका नहीं है, init को पहले से ही प्रारंभिक ऑब्जेक्ट पर शायद ही कभी (मुझे लगता है) पर कॉल करना है।

जिस तरह से मैंने इस समस्या को हल किया, वह UINavigationController का उप-वर्ग बनाना है।

इस उपवर्ग में, मैं ऊपर लिख initwithrootviewcontroller:

- (id) initWithRootViewController:(UIViewController *)rootViewController 
{ 
    UIViewController *fakeController = [[[UIViewController alloc] init] autorelease]; 

    self = [super initWithRootViewController:fakeController]; 
    if(self) 
    { 
     self.fakeRootViewController = fakeController; 
     rootViewController.navigationItem.hidesBackButton = YES; 

     [self pushViewController:rootViewController animated:NO]; 
    } 
    return self; 
} 

fakeRootViewController वास्तव में कुछ नहीं करता है, यह आईओएस rootviewcontroller स्थापित करने के लिए एक संभावना नहीं होने के लिए एक समाधान है।

एक और समारोह में (setRootViewController: aViewController) आप नए 'rootviewcontroller' की backbutton छिपाने तो उपयोगकर्ता देखता है कभी नहीं एक नकली rootviewcontroller नहीं है। और फिर fakerootviewcontroller

poptorootviewcontroller यकीन है कि यह हमेशा ढेर के सूचकांक 1, नहीं सूचकांक 0.

को पॉप viewcontrollers की गेटर बदला जाना चाहिए, तो यह बिना एक सरणी देता है बनाने के लिए ओवरराइट किया जाना चाहिए ऊपर धक्का fakerootviewcontroller (removeobjectatindex: 0)

उम्मीद है कि इससे मदद मिलती है!

+0

@ कोस्टिक का उत्तर केवल रूटव्यू कंट्रोलर के नेविगेशन नियंत्रक को सेट करता है। यह आपको एक ढेर आदि के भीतर एक ढेर के साथ छोड़ देगा .. मेरे मामले में, मुझे popToRootViewController (एक tabbaritem के साथ) के लिए समर्थन की आवश्यकता है, इसलिए यह मेरे लिए काम नहीं करता .. – Jacco

0

आप कस्टम UINavigationController

@interface mySwitchRootViewNavigationController() 

@property (nonatomic, retain) myFirstViewController * FirstViewController; 
@property (nonatomic, retain) mySecondViewController * SecondViewController; 

@end 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.FirstViewController = [[myFirstViewController alloc] init]; 
    self.SecondViewController = [[mySecondViewController alloc] init]; 
} 

-(void) setRootViewControllerWithID:(int) viewControllerID 
{ 
    if (viewControllerID == 1) { 
    self.viewControllers = [NSArray arrayWithObject:self.SecondViewController]; 
    } else 
    { 
    self.viewControllers = [NSArray arrayWithObject:self.FirstViewController]; 
    } 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self setRootViewControllerWithID:intVar]; 
    [super viewWillAppear:animated]; 
} 

प्रारंभ

mySwitchRootViewNavigationController * switchView = [mySwitchRootViewNavigationController alloc] init]; 
1
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController { 

    UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController]; 
    [UIApplication sharedApplication].delegate.window.rootViewController=navController; 
}  
+4

कुछ जानकारी लिखें जो आपके उत्तर को समझाती है। – Hemang

+0

यह मूल नेविगेशन नियंत्रक में आपके द्वारा की गई सभी सेटिंग्स को हटा देगा। – Antenehs

0

स्विफ्ट 3

fileprivate func changeRootVC() { 
     if let newVC = self.storyboard?.instantiateViewController(withIdentifier: "MyStoryboardID"), let nc = self.navigationController { 
      nc.setViewControllers([newVC], animated: true) 
     } 

    } 
संबंधित मुद्दे