2015-08-21 15 views
11

में एक व्यू कंट्रोलर छोड़ें/जोड़ें मेरे पास नेविगेशन कंट्रोलर में एम्बेडेड तीन व्यू कंट्रोलर हैं। मैं वीसी 1 से वीसी 3 तक जाना चाहता हूं ताकि वीसी 3 में नेविगेशन आइटम का बैक बटन उपयोगकर्ता को वीसी 1 के बजाय वीसी 2 पर निर्देशित करेगा। मुझे लगता है कि यह वीसी 1 और वीसी 3 के बीच नेविगेशन स्टैक में वीसी 2 जोड़ना चाहिए जब वीसी 3 बनाया गया है या दूसरे व्यू कंट्रोलर को छोड़कर किया जाना चाहिए।नेविगेशन स्टैक

मैं इस कोशिश की:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let identifier = segue.identifier { 
     switch identifier { 
     case "JumpToThirdVCSegue": 
      if let secondvc = segue.destinationViewController as? SecondViewController { 
       secondvc.performSegueWithIdentifier("ThirdVCSegue", sender: self) 
      } 
     default: break 
     } 
    } 
} 

लेकिन मैं यह काम नहीं कर रहा हो सकता है। शायद कंट्रोलर अभी तक खुला नहीं होने पर एक सेगू करना संभव नहीं है?

दृश्य नियंत्रक को छोड़ने/नेविगेशन स्टैक के बीच में एक व्यू कंट्रोलर जोड़ने का सबसे अच्छा तरीका क्या है? मुझे आशा है कि यह मैं क्या करने की कोशिश कर रहा हूँ समझने के लिए मदद करता है:

उत्तर

12

कुछ इस तरह काम करना चाहिए:

self.navigationController?.pushViewController(viewController2, animated: true) 
    self.navigationController?.pushViewController(viewController3, animated: true) 

संपादित करें:

आप पुश करने के लिए चाहते हैं तीसरे व्यू कंट्रोलर को धक्का देने के बाद उपयोगकर्ता द्वारा देखा जाने वाला दूसरा दृश्य नियंत्रक आपको इसे नेविगेशन नियंत्रक में जोड़ने की आवश्यकता है। यह UINavigationControllerDelegate लागू करके किया जा सकता है। आप अपने दूसरे व्यू कंट्रोलर को एक चर में स्टोर कर सकते हैं और इसे प्रतिनिधि विधि में नेविगेशन नियंत्रकों पदानुक्रम में डाल सकते हैं। आपका मुख्य दृश्य नियंत्रक निम्नलिखित तरह दिखेगा:

class MyViewController: UIViewController, UINavigationControllerDelegate { 

    var viewControllerToInsertBelow : UIViewController? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.navigationController?.delegate = self 
    } 

    func pushTwoViewControllers() { 
     if let viewController2 = self.storyboard?.instantiateViewControllerWithIdentifier("id1"), 
      let viewController3 = self.storyboard?.instantiateViewControllerWithIdentifier("id2") { //change this to your identifiers 
       self.viewControllerToInsertBelow = viewController2 
       self.navigationController?.pushViewController(viewController3, animated: true) 
     } 
    } 

    //MARK: - UINavigationControllerDelegate 
    func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if let vc = viewControllerToInsertBelow { 
      viewControllerToInsertBelow = nil 
      let index = navigationController.viewControllers.indexOf(viewController)! 
      navigationController.viewControllers.insert(vc, atIndex: index) 
     } 
    } 

} 
+1

यह पहले वीसी 2 प्रदर्शित करता है और तुरंत इसके ऊपर वीसी 3 को धक्का देता है, जो बिल्कुल वैसा ही नहीं है, क्योंकि वीसी 2 को 1 और 3 के बीच "दिखाना" चाहिए। हालांकि इसे काम करने के लिए बदला जा सकता है। – alkku

+0

@alkku मेरा संपादित उत्तर देखें। – Adam

5

संपादित करें: तेज और segues का उपयोग कर, यह काम करना चाहिए:

override func performSegueWithIdentifier(identifier: String?, sender: AnyObject?) { 
    super.performSegueWithIdentifier(identifier, sender: sender); 

    if identifier == "JumpToThirdVCSegue" { 
     // now the vc3 was already pushed on the navigationStack 
     var navStackArray : [AnyObject]! = self.navigationController!.viewControllers 
     // insert vc2 at second last position 
     navStackArray.insert(viewController2, atIndex: navStackArray.count - 2) 
     // update navigationController viewControllers 
     self.navigationController!.setViewControllers(navStackArray, animated:false) 
    } 
} 

तो तुम performSegueWithIdentifier VC1 में आदेश नेविगेशन ढेर जब बदलने के लिए ओवरराइड वीसी 3 के लिए सीगू वास्तव में किया गया है (और केवल तैयारी में नहीं है)। यह मानता है कि आप वीसी 1 में इस विशेष नेविगेशन तर्क को संभालना चाहते हैं।

1

मेरा समाधान वीआई 2 में 'कन्स्कीप' घोषित करने की तरह, जब आप इसे छोड़ना चाहिए, तो जब आप इसे छोड़ना चाहिए, तो एक समाधान की स्थिति रखना होगा ताकि अगर आप इसे नीचे की तरह तैयार करना चाहते हैं तो आप इसके अनुसार कार्य कर सकते हैं VC2

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let identifier = segue.identifier { 
     switch identifier { 
     case "JumpToThirdVCSegue": 
      secondvc.shouldSkip=true 

      } 
     default: break 
     } 
    } 
} 

और फिर viewDidLoad VC2 में आप इस BOOL की जाँच करनी चाहिए और अगर यह सच है और segue की जाएगी तथा यदि न सिर्फ आगे बढ़ने आप भी पास पास कर सकता है जब भी छोड़ उस तरह आवश्यक नहीं है

0

एक विधि मौजूद है (link) जो UIViewController छोड़ने को हल करती है मुसीबत। बस सभी आवश्यक UIViewControllers को (नेविगेशन क्रम में) पास करें और अंतिम व्यक्ति को वर्तमान सक्रिय UIViewController (यदि यह पहले से सक्रिय नहीं है) के रूप में बनाया जाएगा।

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