प्रोग्राम को अनावश्यक रूप से कैसे करें?


307

स्टोरीबोर्ड का उपयोग करना बहुत आसान है। आप बस कार्रवाई को "बाहर निकलें" पर खींचें। लेकिन मुझे इसे अपने कोड से कैसे कॉल करना चाहिए?


33
मुझे यह एक वैध प्रश्न लगता है - यह मेरे पास था। आप 1. एक मैनुअल सेग (फाइल के मालिक से एक्जिट के लिए ctrl-drag), 2. इसे IB में एक नाम देते हुए, फिर 3. सामान्य -performSegueWithIdifierifier: 1: अपने कोड में कर सकते हैं।
यांग मेयर

6
आईएमओ बंद नहीं होना चाहिए था। जिन उपयोगकर्ताओं ने इस प्रश्न को बंद करने के लिए मतदान किया है, उन्हें निश्चित रूप से एक ओबज-सी / कोको टच पृष्ठभूमि नहीं लगती है।
एलजे विल्सन

यांग: आप इसे एक नाम कैसे देते हैं?
सरफता

मैं अभी उपयोग करता हूं [स्व बर्खास्त व्यू कंट्रोलरअनुरेटेड: यस पूरा: एनआईएल]; प्रोग्राम से बाहर निकलने के लिए। मुझे नहीं पता कि यह सही तरीका है या नहीं।
tangqiaoboy

1
सरफेटा: आप पहली बार ctrl- ड्रैग से व्यूकंट्रोलर से "एक्जिट" तक एक "मैनुअल लेस्स सेग" बनाते हैं। तब आप डॉक्यूमेंट की रूपरेखा में सेगमेंट का पता लगा सकते हैं।
hugie

जवाबों:


283
  1. एक मैनुअल segue बनाएँ ( ctrlफ़ाइल के स्वामी से बाहर निकलने के लिए -drag),
  2. इसे हरे रंग के EXIT बटन के नीचे लेफ्ट कंट्रोलर मेनू में चुनें।

इसे हरे रंग के EXIT बटन के नीचे लेफ्ट कंट्रोलर मेनू में चुनें

डालने के लिए सेग का नाम डालें।

फिर, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.अपने segue की पहचान के साथ।


25
1) "फ़ाइल का मालिक" - क्या वह पुरानी शब्दावली नहीं है? इसने मेरे लिए व्यू कंट्रोलर से इसके एक्ज़िट आइकन तक ड्रैग को नियंत्रित करने का काम किया। 2) हालांकि यह स्पष्ट होना चाहिए, Xcode IBAction के इंटरफ़ेस में एक घोषणा की तलाश में है जो UIStoryboardSegue तर्क लेता है; WWDC 2012 सेशन 407 टॉक में इस बात का जिक्र नहीं था और उस कोड को इसमें पेस्ट नहीं किया गया था। इसके बिना, कंट्रोल-ड्रैग करने पर मेरा एग्जिट आइकन सक्रिय नहीं होगा। 3) यह बहुत अच्छा है कि आपके बड़े लाल तीर के अंत में, एक्शन फील्ड में, आप "वहां जाएं" तीर को मार सकते हैं!
tobinjim

71
मेरे जैसे किसी भी व्यक्ति के लिए, जो इस उत्तर को लागू करने में अभी भी परेशानी है, मैंने इस रेपो में एक और अधिक सुव्यवस्थित और उदाहरण को एक साथ रखा: github.com/bradley/iOSUnwindSegueProgramatically (अपने आप को विज्ञापित करने की कोशिश नहीं कर रहा, मैंने सिर्फ दीवार के खिलाफ अपना सिर पीटा इस पर घंटों तक और एक कामकाजी सेटअप देखने से मुझे मदद मिलती है।)
ब्रैडलीग्रिफ़िथ

3
@bradleygriffith आप आश्चर्यजनक रूप से सुपर कमाल हैं। महान walkthrough के लिए धन्यवाद!
एली_रोजेन

7
@bradleygriffith काश, आप इसे एक ऐसा उत्तर बना देते जिससे मैं भी इसे चिह्नित कर सकता! आपका अनन्य योगदान यह स्थापित कर रहा था कि कौन सा दृश्य नियंत्रक किस कोड को प्राप्त करता है । कहीं भी नहीं मिल सका। धन्यवाद!
एरोन वेगा

3
किसी के लिए भी, यह अभी भी स्टम्प्ड है, यह है कि IBACTION को उस व्यू कंट्रोलर में होना चाहिए जिसे आप वापस कर रहे हैं, वह नहीं जो आप वर्तमान में हैं। @bradleygriffith ने इसे GitHub पर लिखा है, लेकिन मैंने देखा है कि नहीं कहीं और उल्लेख किया है। वह हिस्सा क्रिटिकल है।
एक्सईवा

163

यहाँ उद्देश्य सी और स्विफ्ट के साथ पूरा जवाब दिया गया है:

1) IBActionअपने डेस्टिनेशन व्यू कंट्रोलर (जहां आप सेगमेंट करना चाहते हैं ) में एक लेस्स्ड सेगमेंट बनाएं । कहीं भी कार्यान्वयन फ़ाइल में।

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) स्रोत दृश्य नियंत्रक (जिस नियंत्रक से आप बहस कर रहे हैं) पर, बाहर निकलने के लिए "गतिविधि का नाम" से "+ खींचें। आपको पॉपअप में चरण 1 में बनाया गया खोलना लीग देखना चाहिए। (यदि आप इसे नहीं देखते हैं, तो चरण एक की समीक्षा करें)। खोलना बूचड़खाना चुनें: पॉपअप से, या जो कुछ भी आपने अपने स्रोत नियंत्रक को IBAction से जोड़ने के लिए अपनी विधि का नाम दिया है।

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

3) स्टोरीबोर्ड के स्रोत दृश्य नियंत्रक के दस्तावेज़ में सेग का चयन करें (यह नीचे के पास सूचीबद्ध किया जाएगा), और इसे एक पहचानकर्ता दें

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

4) स्रोत दृश्य नियंत्रक से इस विधि का उपयोग करके खोल देने वाले को कॉल करें , अपने आराम से नाम का प्रतिस्थापन करें।

// उद्देश्य सी

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

// स्विफ्ट

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

एनबी। स्रोत नियंत्रक पर किसी भी उजागर गुणों तक पहुंचने के लिए सिग्ड पैरामीटर पर sourceViewController संपत्ति का उपयोग करें। इसके अलावा, ध्यान दें कि फ्रेमवर्क स्रोत नियंत्रक को खारिज करता है। यदि आप इस बात की पुष्टि करना चाहते हैं कि एक लॉग संदेश के साथ स्रोत नियंत्रक के लिए एक डीललोक विधि जोड़ें, जिसे एक बार मार दिया गया हो तो उसे फायर करना चाहिए। यदि डीलॉक फायर नहीं करता है तो आपके पास एक चक्र हो सकता है।


2
मेरा कार्यक्रम काम नहीं करता है, कहा भी नहीं जाता है(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
xhg

2
यह समाधान तब काम नहीं करता जब दृश्य नियंत्रक, आप के लिए तैयार नहीं हैं, केवल आपके स्टोरीबोर्ड में मौजूद है, उर्फ ​​कोड कार्यान्वयन में एक कस्टम नहीं है
mnl

@ यकीन नहीं है कि आप क्या कह रहे हैं, लेकिन यह स्टोरीबोर्ड दृश्यों या नीब के साथ काम करता है। यदि आप कोड में एक दृश्य-नियंत्रक दृश्य बना रहे हैं, तो आप उनके नाम में "रिटर्न" आईबी के किसी भी तरीके का उपयोग नहीं करेंगे, जो कोड और आईबी के बीच संचार करने के उद्देश्य से इन के बाद से वास्तव में वैसे भी शून्य है। क्या वह आपकी टिप्पणी को संबोधित करता है?
मुस्कानबोट

1
आपका दिखा चित्र ctrl+dragसे ViewControllerकरने के लिए Exitअविश्वसनीय रूप से मददगार था। धन्यवाद!
kbpontius

स्विफ्ट के लिए 4.2 का उपयोग करें: self.performSegue (withIdentifier: "खोल टीटूसीवी", प्रेषक: स्वयं)
रीफिंगिंग

81

bradleygriffithजवाब बहुत अच्छा था। मैंने 10 कदम उठाए और सरलीकरण के लिए एक स्क्रीनशॉट बनाया। यह Xcode 6 में एक स्क्रीनशॉट है।

  1. दृश्य में किसी भी क्रिया / बटन के बिना खोलना बनाने के लिए नारंगी आइकन से लाल निकास आइकन पर नियंत्रण-खींचें।

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

  1. फिर unwind segueसाइडबार में चयन करें :

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

  1. एक पहचानकर्ता स्ट्रिंग सेट करें:

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

  1. उस पहचानकर्ता को कोड से एक्सेस करें:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

4
सबसे पहले, undinding के लिए विधि के अंदर शामिल किया जाना चाहिए UIViewController। फिर आपका समाधान काम करेगा
एलेक्स Cio

5
और आपको इस नए segue के लिए Identifier को सेट करना होगा! इसके बारे में मत भूलना।
kagag22

1
क्या प्रोग्राम व्यू कंट्रोलर में "एक्जिट" कनेक्शन प्रोग्रामेटिक रूप से बनाना संभव है?
एंड्रयू किरना

13

मैंने इस्तेमाल किया [self dismissViewControllerAnimated: YES completion: nil];जो आपको कॉलिंग पर लौटाएगा ViewController


6
लैरी, यह एक पूरी तरह से वैध तरीका है यदि आप पिछले व्यू कंट्रोलर के पास लौटना चाहते हैं, यानी जो आपने प्रस्तुत किया है वह अब बाहर निकल रहा है। यह सवाल सामने आया क्योंकि Xcode 4.5 में नया एक प्रस्तुति कंट्रोलर से कहीं ज्यादा पहले के व्यू कंट्रोलर के लिए "व्यू" की क्षमता है। विवरण के लिए WWDC 2012 सत्र 407 देखें।
tobinjim

11

Unwind Segue पर Apple के तकनीकी नोट से पाठ का हवाला देते हुए: एक ऐसे सहज वाद को जोड़ने के लिए, जिसे केवल प्रोग्रामेटिक रूप से ट्रिगर किया जाएगा, दृश्य के कंट्रोल कंट्रोलर आइकन से उसके एक्ज़िट आइकन तक नियंत्रण, ड्रैग करें, फिर पॉपअप मेनू से नए segue के लिए एक सेक्शन को चुनें।

तकनीकी नोट के लिए लिंक


6

ऊपर विशाल चौधरी का जवाब मेरे लिए काम कर गया। मैं यह भी जोड़ना चाहूंगा कि मैन्युअल रूप से सीक को ट्रिगर करने के लिए:

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

व्यूकंट्रोलर के भीतर से आपको स्टोरीबोर्ड में ViewController के दृश्य के तहत और इसके अलावा आरएचएस पर गुणों के दृश्य में सिगर्ड सीग का चयन करना होगा यह सुनिश्चित करें कि इंडेंटिफायर क्षेत्र में वह नाम शामिल है जिसे आप कोड में उल्लेख कर रहे हैं ("mySegueName" ऊपर दिए गए उदाहरण में) )।

यदि आप इस चरण को छोड़ देते हैं, तो ऊपर की रेखा एक अपवाद फेंक देगी जो कि seque नाम ज्ञात नहीं है।


3

पीछे की ओर संगत समाधान जो ios6 से पहले के संस्करणों के लिए काम करेगा, जो इच्छुक हैं:

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}

2
अनवार्ड सेगमेंट, नेविगेशन कंट्रोलर स्टैक में एक निश्चित वर्ग में वापस पॉपिंग की तुलना में बहुत अधिक करते हैं।
स्टीव मोजर

2

स्विफ्ट 4 :

1. नियंत्रक के अंदर एक @IBAction बनाएं, जिसे आप खोलना चाहते हैं:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. स्टोरीबोर्ड में, उस कंट्रोलर से जिसे आप setrl + से सेगमेंट (खोलना) चाहते हैं, कंट्रोलर साइन से एक्ज़िट साइन से बाहर निकलें और आपके द्वारा पहले बनाई गई विधि का चुनाव करें:

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

3. अब आप देख सकते हैं कि दस्तावेज़ की रूपरेखा में आपके पास शीर्षक "अनविंड सेग ...." के साथ नई पंक्ति है। अब आपको इस लाइन पर क्लिक करना चाहिए और पहचानकर्ता को सेट करने के लिए विशेषता निरीक्षक को खोलना चाहिए (मेरे मामले में shrSegueIdentifier )।

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

4. आप लगभग पूरा कर चुके हैं! अब आपको व्यू कंट्रोलर खोलने की आवश्यकता है जिससे आप कुछ ऐसी विधि बना सकते हैं, जो कुछ विधि का निर्माण करेगी। उदाहरण के लिए आप बटन जोड़ सकते हैं, इसे @IBAction के साथ कोड से जोड़ सकते हैं , उसके बाद इस IBAction में perfromSegue (withIdentifier: भेजने वाला :) विधि जोड़ें:

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

तो आपको बस इतना ही करना है!


क्या प्रोग्राम व्यू कंट्रोलर में "एक्जिट" कनेक्शन प्रोग्रामेटिक रूप से बनाना संभव है?
एंड्रयू किरना

1

स्विफ्ट 4.2, Xcode 10+

वीसी के साथ ऐसा करने की सोच रखने वालों के लिए स्टोरीबोर्ड के माध्यम से सेट अप नहीं किया जाता है (जो इस सवाल को "प्रोग्रामेटिकली" + "लेसर सेग") से खोजते हैं।

यह देखते हुए कि आप प्रोग्राम को व्यवस्थित रूप से खोल नहीं सकते, सरलतम प्रोग्रामेटिक सॉल्यूशन कॉल करना है:

navigationController?.popToRootViewController(animated: true)

जो स्टैक पर सभी व्यू कंट्रोलर्स को आपके रूट व्यू कंट्रोलर में वापस पॉप कर देगा।


नेविगेशन स्टैक से केवल सबसे ऊपरी दृश्य नियंत्रक पॉप करने के लिए, उपयोग करें:

navigationController?.popViewController(animated: true)


1
यह आम तौर पर आप जितना चाहते हैं उससे अधिक है - बस एक को वापस करने के लिए: [self.navigationController popViewControllerAnimated: YES];
एंडी वाइंस्टीन

वास्तव में, मैंने अपने उत्तर में यह जोड़ा है - धन्यवाद @AndyWeinstein
10623169

0

FYI करें: @ Vadim के जवाब के लिए एक मैनुअल कंट्रोलर के साथ काम करने के लिए एक व्यू कंट्रोलर के भीतर से सीक्वेंस एक्शन बुलाया जाता है जिसे आपको कमांड में रखना होगा:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

ओवरराइड वर्ग विधि के अंदर viewDidAppear इसलिए की तरह:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

यदि आप इसे ViewDidLoad या viewWillAppear जैसे अन्य ViewController तरीकों में रखते हैं तो इसे अनदेखा कर दिया जाएगा।


3
निश्चित रूप से गलत है। जहाँ भी आप चाहते हैं से PerformSegueWithIdentifier को कॉल करें।
स्माइलबोट

क्या दृश्य लोड होते ही यह सिंपल सेगमेंट नहीं कर पाएगा? जब आप चाहते हैं, तो प्रदर्शन करने के बजाय, बटन दबाने के बाद।
१०:१४ पर पाहन्व

@ पवन ने हां कर दी। मुझे नहीं पता कि इस उत्तर को कोई कैसे मिला। कॉलिंग performSegueWithIdentfierठीक यही करता है: एक ViewController से दूसरे करने के लिए
बहस कर

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