अनविंड सेगमेंट क्या हैं और आप उनका उपयोग कैसे करते हैं?


584

iOS 6 और Xcode 4.5 में एक नया फीचर है जिसे "अनविंड सेग" कहा जाता है:

अनवार्ड सेगमेंट स्टोरीबोर्ड में दृश्यों के मौजूदा उदाहरणों में संक्रमण की अनुमति दे सकता है

Xcode 4.5 के रिलीज़ नोटों में इस संक्षिप्त प्रविष्टि के अलावा, UIViewController अब कुछ नए तरीके अपनाती है:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

सेगमेंट कैसे काम करते हैं और उनके लिए क्या उपयोग किया जा सकता है?

जवाबों:


1267

संक्षेप में

एक आकस्मिक सेग (जिसे कभी-कभी एक्जिट सेग कहा जाता है ) का उपयोग पुश, मोडल या पॉपओवर सेगमेंट के माध्यम से वापस नेविगेट करने के लिए किया जा सकता है (जैसे कि यदि आप नेविगेशन बार से नेविगेशन आइटम को पॉपप करते हैं, तो पॉपओवर बंद कर दिया है या सामान्य रूप से प्रस्तुत दृश्य नियंत्रक को खारिज कर दिया है)। उसके शीर्ष पर आप वास्तव में केवल एक ही नहीं बल्कि पुश / मोडल / पॉपओवर सेगमेंट की श्रृंखला के माध्यम से खोल सकते हैं, उदाहरण के लिए एक एकल कार्रवाई के साथ अपने नेविगेशन पदानुक्रम में "कई कदम पीछे हटें"।

जब आप एक आराम से बहस करते हैं, तो आपको एक कार्रवाई निर्दिष्ट करने की आवश्यकता होती है, जो उस दृश्य नियंत्रक की एक क्रिया विधि है जिसे आप खोलना चाहते हैं।

उद्देश्य सी:

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

स्विफ्ट:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

इस क्रिया विधि का नाम तब उपयोग किया जाता है जब आप स्टोरीबोर्ड में खोलना लीग बनाते हैं। इसके अलावा, इस विधि को सिंघम लीग के प्रदर्शन से ठीक पहले कहा जाता है। आप पास किए गए UIStoryboardSegueपैरामीटर से स्रोत व्यू कंट्रोलर को उस व्यू कंट्रोलर से बातचीत करने के लिए प्राप्त कर सकते हैं जिसने सीग की पहल की है (जैसे कि मोडल व्यू कंट्रोलर के संपत्ति मान प्राप्त करने के लिए)। इस संबंध में, विधि की विधि के समान कार्य prepareForSegue:है UIViewController

iOS 8 अपडेट: Unwind सेगेट्स iOS 8 के अनुकूली सेगमेंट के साथ भी काम करते हैं, जैसे कि Show और Show Detail

एक उदाहरण

आइए एक नेविगेशन कंट्रोलर और तीन चाइल्ड व्यू कंट्रोलर्स के साथ एक स्टोरीबोर्ड रखें:

यहाँ छवि विवरण दर्ज करें

ग्रीन व्यू कंट्रोलर से आप रेड व्यू कंट्रोलर के पास (वापस नेविगेट) कर सकते हैं। ब्लू से आप ग्रीन या रेड से ग्रीन के माध्यम से खोल सकते हैं। अनइंडिंग को सक्षम करने के लिए आपको विशेष एक्शन विधियों को रेड और ग्रीन में जोड़ना होगा, जैसे कि रेड में एक्शन विधि है:

उद्देश्य सी:

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

स्विफ्ट:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

एक्शन मेथड जोड़े जाने के बाद, आप स्टोरीबोर्ड में दिए गए सीग को एक्ज़िट आइकन पर कंट्रोल-ड्रैग करके परिभाषित कर सकते हैं। जब हम बटन दबाते हैं तो हम ग्रीन से रेड को खोलना चाहते हैं:

यहाँ छवि विवरण दर्ज करें

आपको उस क्रिया का चयन करना होगा जिसे उस दृश्य नियंत्रक में परिभाषित किया गया है जिसे आप निम्न करना चाहते हैं:

यहाँ छवि विवरण दर्ज करें

आप रेड से ब्लू (जो कि नेविगेशन स्टैक में "दो कदम दूर" है) को खोल सकते हैं। कुंजी सही खोलना कार्रवाई का चयन कर रही है।

आराम से किए जाने वाले वाद-विवाद को निष्पादित करने से पहले, क्रिया विधि को कहा जाता है। उदाहरण में मैंने ग्रीन और ब्लू दोनों से रेड के लिए एक आराम से बहस को परिभाषित किया। हम UIStoryboardSegue पैरामीटर के माध्यम से एक्शन विधि में खोल के स्रोत तक पहुँच सकते हैं:

उद्देश्य सी:

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
    UIViewController* sourceViewController = unwindSegue.sourceViewController;

    if ([sourceViewController isKindOfClass:[BlueViewController class]])
    {
        NSLog(@"Coming from BLUE!");
    }
    else if ([sourceViewController isKindOfClass:[GreenViewController class]])
    {
        NSLog(@"Coming from GREEN!");
    }
}

स्विफ्ट:

@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
    if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
        println("Coming from BLUE")
    }
    else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
        println("Coming from RED")
    }
}

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

यहाँ छवि विवरण दर्ज करें

कोड से अवांछित

जब आप किसी व्यू कंट्रोलर के एग्जिट सिंबल पर किसी चीज को कंट्रोल-ड्रैग करके एक लेग सेग को परिभाषित करते हैं, तो डॉक्यूमेंट आउटलाइन में एक नया सेगमेंट दिखाई देता है:

यहाँ छवि विवरण दर्ज करें

बहस का चयन करना और गुण निरीक्षक के पास जाने से "पहचानकर्ता" संपत्ति का पता चलता है। अपने सेगमेंट को एक विशिष्ट पहचानकर्ता देने के लिए इसका उपयोग करें:

यहाँ छवि विवरण दर्ज करें

इसके बाद, किसी अन्य सेग्मेंट की तरह ही, इस लीग को लीग से अलग किया जा सकता है:

उद्देश्य सी:

[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];

स्विफ्ट:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

12
+1 शानदार जवाब। वे वास्तव में अच्छा लग रहा है, लेकिन तरीकों की तरह dismissViewControllerAnimated:completion:या popViewControllerAnimated:एक ही चीज़ को प्राप्त नहीं कर सकते हैं ?
सैम स्पेंसर

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

7
अपनी हेडर फ़ाइल में अपनी क्रिया विधि जोड़ना सुनिश्चित करें अन्यथा स्टोरीबोर्ड के बारे में पता नहीं चलेगा।
काइल सी

17
से अधिक एक और लाभ यह dismissViewControllerAnimated:completion:या popViewControllerAnimated:कि विधि आप आप के लिए तनाव मुक्त कर रहे हैं दृश्य नियंत्रक को जोड़ा गया कहा जाता है और इसलिए आप एक आसान तरीका प्रस्तुत दृश्य नियंत्रक जानने की आवश्यकता पेश दृश्य नियंत्रक प्रस्तुत दृश्य नियंत्रक के एक प्रतिनिधि बनाने के लिए बिना समाप्त हो गया है ।
मानद

8
क्या मैं एक मामूली संपादन का सुझाव दे सकता हूं? यह "स्पष्ट रूप से" स्पष्ट नहीं था कि आपने - (IBAction) खोल दिया: (UIStoryboardSegue *) को RedViewController.m में खोल दिया। शानदार जवाब और अब मैं अन्य मुद्दों के लिए इसका इस्तेमाल करूंगा। धन्यवाद!
जॉन बॉलिंजर

166

जहाँ तक StoryBoard में सेगमेंट का उपयोग करने का तरीका है ...

चरण 1)

उस दृश्य नियंत्रक के लिए कोड पर जाएं जिसे आप खोलना और इसे जोड़ना चाहते हैं:

उद्देश्य सी

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

ओबज-सी में अपनी .h फ़ाइल में इस विधि को भी घोषित करना सुनिश्चित करें

तीव्र

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

चरण 2)

स्टोरीबोर्ड में, उस दृश्य पर जाएं जिसे आप से खोलना चाहते हैं और बस अपने स्रोत से ऊपरी दाईं ओर स्थित छोटे ऑरेंज "EXIT" आइकन पर अपने बटन से एक सेगमेंट खींचें।

यहाँ छवि विवरण दर्ज करें

अब "- BundToViewControllerNameHere" से कनेक्ट करने का विकल्प होना चाहिए

यह है, जब आपका बटन टैप किया जाता है तो आपका सेगमेंट छोटा हो जाएगा।


5
मैंने पाया है कि Xcode 4.5 के साथ और इससे पहले हेडर में IBAction घोषित करना आवश्यक था। मुझे नहीं पता कि क्या यह अभी भी सच है।
स्टीवन फिशर

2
क्या स्टोरीबोर्ड के बिना चरण 2 करने का एक तरीका है, अर्थात प्रोग्रामेटिक रूप से? मेरे स्टोरीबोर्ड (इंटरफ़ेस बिल्डर) को गड़बड़ कर दिया गया है और यह खोल के लीग (एक्सकोड बग) को नहीं दिखाता है।
वान डू ट्रान

46

अनवार्ड सेगमेंट का उपयोग कुछ व्यू कंट्रोलर को "वापस जाने" के लिए किया जाता है, जिसमें से कई सेगमेंट के माध्यम से आपको "करंट" व्यू कंट्रोलर में मिला।

कल्पना कीजिए कि आपके पास इसके रूट व्यू कंट्रोलर के MyNavControllerसाथ कुछ है A। अब आप पुश सेग का उपयोग करते हैं B। अब नेविगेशन कंट्रोलर में ए और बी है viewControllers, और बी दिखाई दे रहा है। अब आप Cसंयत रूप से प्रस्तुत करें ।

खोलना segues के साथ, आप कर सकता है अब खोलना से "वापस" Cके लिए B(यानी रीति से प्रस्तुत दृश्य नियंत्रक खारिज), मूल रूप से मोडल segue "नाश"। आप रूट व्यू कंट्रोलर के पास सभी तरीके को Aखोल सकते हैं, जो मोडल सेग और पुश सेग दोनों को पूर्ववत करते हैं।

अनविंड सेगमेंट्स को पीछे करना आसान बनाता है। उदाहरण के लिए, आईओएस 6 से पहले, प्रस्तुत दृश्य नियंत्रक को खारिज करने के लिए सबसे अच्छा अभ्यास प्रस्तुत दृश्य नियंत्रक को प्रस्तुत किए गए दृश्य नियंत्रक के प्रतिनिधि के रूप में सेट करना था , फिर अपने कस्टम प्रतिनिधि विधि को कॉल करें, जो तब प्रस्तुत दृश्य नियंत्रक को खारिज कर देता है । ध्वनि बोझिल और जटिल? ये था। यही कारण है कि आराम से बहस अच्छे हैं।


7
आप dismissViewController:animatedप्रस्तुत नियंत्रक से कॉल कर सकते हैं । आपको वह प्रतिनिधि नहीं बनाना है। बेशक, यदि आपको डेटा वापस करने की आवश्यकता है, तो आपको प्रतिनिधिमंडल या किसी अन्य विधि की आवश्यकता है।
mxcl

3
जब आप dismissViewController:animated:प्रस्तुत नियंत्रक से कॉल कर सकते हैं , तो "सबसे अच्छा अभ्यास" वास्तव में आपके लिए ऐसा करने के लिए प्रस्तुतकर्ता नियंत्रक पर एक प्रतिनिधि विधि को कॉल करना है, जैसा कि यांग ने उल्लेख किया है।
क्रिस नॉलेट

36

कुछ ऐसा है जो मैंने अन्य उत्तरों में नहीं देखा है, यह है कि जब आप यह नहीं जानते कि आप शुरुआती समय में कहां से उत्पन्न हुए हैं, तो यह कैसे पता चलता है कि मेरे लिए एक और भी महत्वपूर्ण उपयोग मामला है। उदाहरण के लिए, मान लें कि आपके पास एक सहायता दृश्य नियंत्रक ( H ) है, जिसे आप दो अलग-अलग दृश्य नियंत्रकों ( A और B ) से सामान्य रूप से प्रदर्शित करते हैं :

एच
बीएच

आप आराम से लीग को कैसे सेट करते हैं ताकि आप सही दृश्य नियंत्रक पर वापस जाएं? इसका उत्तर यह है कि आप और बी में एक ही नाम के साथ एक ऐक्शन की घोषणा करते हैं , जैसे:

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

इस तरह, खोल को जो भी दृश्य नियंत्रक ( या बी ) मिलेगा, ने पहल शुरू की और इसे वापस जाना।

दूसरे शब्दों में, यह वर्णन करने की क्रिया को समझें कि यह तर्क कहां से आ रहा है , बजाय इसके कि यह कहां जा रहा है।


2
इस जानकारी के लिए धन्यवाद, मैं इस के लिए देख रहा था।
मधु

2
यह वास्तव में इस जानकारी का उल्लेख करने के लिए बहुत अच्छा है क्योंकि मैं पहले से ही समाधान को लागू कर रहा हूं और तब तक कुछ भी नहीं होता जब तक मैं आपकी टिप यहां नहीं प्राप्त करता हूं, आपके समर्थन के लिए बहुत धन्यवाद
अमृत ​​गुस्सा

यह जानकारी का एक बड़ा टुकड़ा है! आपका बहुत बहुत धन्यवाद!
डोमिनिक शीशी

24

स्विफ्ट iOS:

चरण 1: इस विधि को अपने मास्टर नियंत्रक दृश्य में परिभाषित करें। जिसमें आप वापस जाना चाहते हैं:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

चरण 2: (StoryBoard) आप पर राइट क्लिक SLAVE / CHILD EXIT बटन और "goToSideMenu" का चयन करें कार्रवाई के रूप में आपको बटन कनेक्ट करने के लिए जिस पर आप वापस लौटने के लिए क्लिक करेंगे MASTER नियंत्रक दृश्य:

यहाँ छवि विवरण दर्ज करें चरण 3: बनाएँ और चलाएँ ...


1

उदाहरण के लिए यदि आप viewControllerB से viewControllerA पर नेविगेट करते हैं तो आपके viewControllerA में प्रतिनिधि नीचे कॉल करेगा और डेटा साझा करेगा।

@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
        if sender.source is ViewControllerB  {
            if let _ = sender.source as? ViewControllerB {
                self.textLabel.text = "Came from B = B->A , B exited"
            }
            
        }

}
  • सीवर सोर्स सोर्स व्यूवर को अनविंड करें (आपको एग्जिट बटन को वीसी के एग्जिट आइकन से कनेक्ट करना होगा और उसे अनइंडसाइन से कनेक्ट करना होगा:

यहाँ छवि विवरण दर्ज करें

  • अनवार्ड सीग पूरा हो गया -> टेक्स्टलाब ऑफ व्यूकंट्रोलर ए चेंजेड है।

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.