29

नेविगेशन स्टैक को देखने के लिए संभव है और फिर इसे सीधे आगे बढ़ाएं?उसी क्रिया में दृश्य नियंत्रकों को पॉपिंग और पुशिंग

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

जब एक बटन क्लिक मैं इस कोड निष्पादित:

[[self navigationController] popViewControllerAnimated:YES]; 
     MapsViewController *aViewController = [[MapsViewController alloc] 
               initWithNibName:@"MapsViewController" bundle:nil]; 
[self.navigationController pushViewController:aViewController animated:NO]; 
[aViewController release]; 

यह बंद ठीक पॉपिंग है, लेकिन किसी भी धक्का का कोई संकेत नहीं theres! किसी भी सहायता की सराहना की जाएगी।

उत्तर

38
MapsViewController *aViewController = [[MapsViewController alloc] 
             initWithNibName:@"MapsViewController" bundle:nil]; 
    // locally store the navigation controller since 
    // self.navigationController will be nil once we are popped 
UINavigationController *navController = self.navigationController; 

    // retain ourselves so that the controller will still exist once it's popped off 
[[self retain] autorelease]; 

    // Pop this controller and replace with another 
[navController popViewControllerAnimated:NO];//not to see pop 

[navController pushViewController:aViewController animated:YES];//to see push or u can change it to not to see. 

या

MapsViewController *aViewController = [[MapsViewController alloc] 
             initWithNibName:@"MapsViewController" bundle:nil]; 


UINavigationController *navController = self.navigationController; 

//Get all view controllers in navigation controller currently 
NSMutableArray *controllers=[[NSMutableArray alloc] initWithArray:navController.viewControllers] ; 

//Remove the last view controller 
[controllers removeLastObject]; 

//set the new set of view controllers 
[navController setViewControllers:controllers]; 

//Push a new view controller 
[navController pushViewController:aViewController animated:YES]; 
+0

यह सिर्फ इतना नहीं है कि मैं धक्का नहीं देख पा रहा हूं, ऐसा नहीं हो रहा है। कम से कम कोई सबूत नहीं है कि यह हुआ है। – Josh

+0

यह MapViewController – Josh

+0

का एक उदाहरण है मैंने अपना कोड अपडेट किया है बस इसे पेस्ट करें और –

26

https://stackoverflow.com/users/1619554/tomer-peled के समाधान से लिया है, तो दूसरों के लिए इसे और अधिक आसानी से पा सकते हैं।

UIViewController *newVC = [[UIViewController alloc] init]; // Replace the current view controller 
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]]; 
[viewControllers removeLastObject]; 
[viewControllers addObject:newVC]; 
[[self navigationController] setViewControllers:viewControllers animated:YES]; 
+1

यह समाधान आईओएस 8 के साथ मेरे लिए काम करता है और चयनित उत्तर नहीं। धन्यवाद! – thefoyer

12

स्विफ्ट में:

यह iOS8 के लिए यह करने के लिए सबसे अच्छा तरीका हो गया लगता है

let newVc = UIViewController() 
var vcArray = self.navigationController?.viewControllers 
vcArray!.removeLast() 
vcArray!.append(newVc) 
self.navigationController?.setViewControllers(vcArray!, animated: false) 

मामले में newVc एक स्टोरीबोर्ड में मौजूद है:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let newVc = storyboard.instantiateViewControllerWithIdentifier("YourViewControllerIdentifier") as! UIViewController 
var vcArray = self.navigationController?.viewControllers 
vcArray!.removeLast() 
vcArray!.append(newVc) 
self.navigationController?.setViewControllers(vcArray!, animated: false) 
+0

रॉड्रिगो, साल्वौ मेयू दीया। vlw! –

+0

धन्यवाद, मेरा दिन बचाया :) –

4

आप पॉप या अपने नियंत्रक को धक्का देने के लिए इस कोड का उपयोग कर सकते हैं।

स्विफ्ट लिए

var alreadyPushed = false    
     //Check if the view was already pushed 
     if let viewControllers = self.navigationController?.viewControllers { 
      for viewController in viewControllers {      
       if let viewController = viewController as? YourControllerName {            
        self.navigationController?.popToViewController(viewController, animated: true);       
        print(" Push Your Controller") 
        alreadyPushed = true 
        break       
       } 
      } 
     }       
     if alreadyPushed == false {     
      let YourControllerObject = self.storyboard?.instantiateViewControllerWithIdentifier("YourControllerIdentifire") as! YourControllerName    
      self.navigationController?.pushViewController(YourControllerObject, animated: true) 

     } 
उद्देश्य सी

bool alreadyPushed = false;  
//Check if the view was already pushed 
NSMutableArray *viewControllers; 
if ((viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers])) { 

    for (UIViewController *aViewController in viewControllers) { 

     if ([aViewController isKindOfClass:[YourControllerName class]]) { 
      NSLog(@"pop your view controller"); 
      [self.navigationController popToViewController:aViewController animated:YES]; 
      alreadyPushed = true; 
      break; 
     } 
    } 
} 

//Push Fresh View 
if(alreadyPushed == false) { 

    NSLog(@"push your view controller"); 
    YourControllerName *YourControllerObject = [[YourControllerName alloc]initWithNibName:@"YourNibName" bundle:nil];   
    [self.navigationController pushViewController:YourControllerObject animated:YES]; 

} 

लिए

0
BOOL Present = NO; 

fifthViewController * fifthVC = [self.storyboard instantiateViewControllerWithIdentifier:@"homeController"]; 


for (UIViewController* viewController in self.navigationController.viewControllers) { 

    //This if condition checks whether the viewController's class is MyGroupViewController 
    // if true that means its the MyGroupViewController (which has been pushed at some point) 
    if ([viewController isKindOfClass:[fifthViewController class]]) 
    { 

     // Here viewController is a reference of UIViewController base class of MyGroupViewController 
     // but viewController holds MyGroupViewController object so we can type cast it here 
     fifthViewController *groupViewController = (fifthViewController*)viewController; 
     [self.navigationController popToViewController:groupViewController animated:NO]; 
     Present=YES; 
    } 

} 

if(Present==NO) 
{ 
    [self PushAnimation]; 
    [self.navigationController pushViewController:fifthVC animated:NO]; 

    Present=YES; 
} 
0

स्विफ्ट 3,0

मामले में किसी को जी चाहता है ओ दृश्य पदानुक्रम में गहरी:

   //Go back to desired viewController and then push another viewController 
       var viewControllers = self.navigationController!.viewControllers 
       while !(viewControllers.last is MyViewControllerClass) { 
        viewControllers.removeLast() 
       } 
       // go to new viewController 
       let anotherViewController = AnotherViewController(nibName: "AnotherViewController", bundle: nil) 
       viewControllers.append(anotherViewController) 
       self.navigationController?.setViewControllers(viewControllers, animated: true) 
1

स्विफ्ट 4:

self.navigationController.setViewControllers[].. मेरे लिए बाहर काम नहीं करता है। लेकिन मैं एक आवृत्ति परिवर्तक में एक नेविगेशन नियंत्रक रखकर इस मुद्दे को हल करने में सक्षम हूं और पुश/पॉप ऑपरेशन करता हूं। इस प्रकार, चुपचाप बिना गड़बड़ के नियंत्रक बदलने में सक्षम।

let navigationVC = self.navigationController 
    navigationVC?.popViewController(animated: false) 
    navigationVC?.pushViewController(myNewVC, animated: false) 
संबंधित मुद्दे