2011-10-30 22 views
39

पर टैप पर किए गए सशर्त सेग्यू मैं एक्सकोड 4.2 का उपयोग कर आईओएस 5 के लिए कुछ प्रोजेक्ट पर काम कर रहा हूं। मेरे पास एक UITableViewController है और उपयोगकर्ता सेल तालिका पर टैप करते समय एक सेगू करना चाहता है, लेकिन गंतव्य दृश्य नियंत्रक उस सेल पर किए गए क्रिया पर निर्भर करता है। उदाहरण के लिए, जब उपयोगकर्ता सेल पर टैप करता है तो मैं SomeViewController लोड करना चाहता हूं, लेकिन जब उपयोगकर्ता संपादन मोड में उसी सेल पर टैप करता है तो मैं AnotherViewController लोड करना चाहता हूं। दुर्भाग्य से, एक्सकोड 4.2 स्टोरीबोर्ड बिल्डर में एक ही सेल पर एकाधिक सेग्स को कॉन्फ़िगर करने का कोई तरीका नहीं है, या मुझे बस यह नहीं मिला है। शायद कोड संपादक में, हाथ से segue बनाने का एक तरीका है। आम तौर पर जो मैं प्राप्त करना चाहता हूं वह है कि उपयोगकर्ता को एक व्यू कंट्रोलर का उपयोग करके सेल द्वारा प्रतिनिधित्व किए गए आइटम को "दर्ज करें" और एक अन्य दृश्य नियंत्रक का उपयोग करके उसी सेल द्वारा प्रदर्शित आइटम को "संपादित" करने का एक तरीका प्रदान करना है। दूसरी दृश्य नियंत्रक (संपादक) पर स्विच करना जब टेबल-एडिट-मोड में केवल मेरा पहला था, लेकिन शायद एक बेहतर तरीका है। किसी भी तरह की सहायता को आभार समझेंगे।UITableViewCell

+2

मैं सिर्फ यह समझ गए होंगे बाहर। यह सरल है, और एक्सकोड स्टोरीबोर्ड संपादक का उपयोग करके किया जा सकता है। मैंने अपने टेबल व्यू कंट्रोलर को दो दृश्यों को जोड़ा है जो अलग-अलग दृश्य नियंत्रकों को इंगित करते हैं, और जब मैं सेल का चयन करता हूं तो कोड से उचित एक ट्रिगर कर रहा हूं, और इसके आधार पर संपादन मोड में किया जाता है या नहीं - मैं उचित सेगू ट्रिगर कर रहा हूं। इससे पहले मैंने एक ही सेल चुड़ैल में एकाधिक सेगू जोड़ने की कोशिश की है, संभव नहीं है। – Darrarski

+3

यह अच्छा होगा अगर आपने इस पर एक उत्तर में विस्तार किया, यह दिखाते हुए कि आप segues कैसे सेट करते हैं। – JohnMerlino

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है, मेरे पास स्रोत से segues के साथ दो गंतव्य दृश्य नियंत्रक हैं लेकिन यह नहीं पता कि विशिष्ट segue कैसे ट्रिगर करें ??? – Bear

उत्तर

53

स्टोरीबोर्ड को देखते हुए, अपने स्रोत से नियंत्रण-खींचें अपने गंतव्य दृश्य नियंत्रक को नियंत्रक देखें। यह एक सीगू बनाएगा कि आप अपने स्रोत देखें प्रोग्रामर से प्रोग्रामेटिक रूप से सही ट्रिगर कर सकते हैं। सुनिश्चित करें कि आप एक नाम Segue देते हैं। यह नाम वह है जिसे आप स्रोत देखेंगे नियंत्रक के प्रदर्शन से संबंधित: उदाहरण के साथ: विधि।

+5

जो प्रश्न मैंने अक्सर इस प्रश्न में देखा है, उस जवाब में जो कुछ भी देखा गया है वह है कि स्पर्श को कैसे पहचानें जो आम तौर पर ट्रिगर करता है अब segue कि आप इसे सेल से अलग कर दिया है। जवाब आपके UITableViewController में 'tableView: didSelectRowAtIndexPath:' को लागू करना है - भले ही यह एक स्थिर तालिका दृश्य हो। उस विधि के लिए शरीर में, आप अपना सशर्त कोड डालते हैं और 'performSegue: withIdentifier:' जब स्थितियां सही होती हैं – Rhubarb

+0

बिंदु यह है कि आप तालिका से एक से अधिक सेग्यू सेट कर सकते हैं प्रोटोटाइप सेल देखें। बस उन्हें अलग पहचानकर्ता दें। इस तरह आपके द्वारा किया गया चयन करेंटएंड इंडेक्सपैथ: यदि आप ([self.tableview isEditing]) को एक शर्त सेट कर सकते हैं और आपके द्वारा सेट किए गए पहचानकर्ता का उपयोग करने में सेग्यू का कारण बन सकते हैं। – smileBot

33

मैं अतिरिक्त जवाब जोड़ रहा हूं क्योंकि इसके अलावा कई अन्य स्थानों में चयनित एक को पढ़ने के बाद - और सही उत्तर है - मैंने खुद को यह सोचने के लिए आश्चर्यचकित किया कि स्पर्श को कैसे पहचानें जो आम तौर पर सीगू को ट्रिगर करेगा । आप देखते हैं, यदि आप तालिका दृश्य कक्ष से अगले नियंत्रक को ctrl-dragging द्वारा अपना सेगू सामान्य तरीका बनाते हैं, तो आपके लिए दो चीजें स्वचालित रूप से की जाती हैं।

  1. सेल में स्पर्श का पता चला है
  2. segue

किया जाता है लेकिन निश्चित रूप से, आप segue ब्लॉक नहीं कर सकते हैं।

अब अगर आप को सशर्त segue, तो चाहते हैं (जैसा कि अन्य उत्तर में उल्लेख किया है) आपको लगता है कि segue हटा सकते हैं और UITableViewController (खींचें से वस्तुओं स्टोरीबोर्ड बजाय नेविगेटर) अगले करने के लिए से एक नया बना नियंत्रक - और इसे एक नाम दें।

फिर - और यह वह हिस्सा है जो मैं गायब था - tableView:didSelectRowAtIndexPath को अपने टेबल व्यू कंट्रोलर में प्रोग्रामिंग और सशर्त रूप से सेगू को नीचे करने के लिए लागू करें।

ध्यान दें कि आपको किसी भी तरह से अपने सेल की पहचान करने की आवश्यकता है ताकि आप जान सकें कि जिस व्यक्ति में आप रुचि रखते हैं उसे चुना गया है। आप एक स्थिर तालिका में इंडेक्स पथ को जानकर ऐसा कर सकते हैं, लेकिन मैं अपने सेल को आईबी में अद्वितीय पहचानकर्ता सेट करना पसंद करता हूं (भले ही मुझे इसे स्थैतिक तालिका के बाद से इसे हटाने की आवश्यकता नहीं है) और इसे जांचना। इस तरह यदि मैं स्थिर तालिका में अपने सेल को ऊपर या नीचे ले जाता हूं, तो मुझे इस कोड को बदलने की आवश्यकता नहीं होगी।

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Find the selected cell in the usual way 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    // Check if this is the cell I want to segue from by using the reuseIdenifier 
    // which I set in the "Identifier" field in Interface Builder 
    if ([cell.reuseIdentifier isEqualToString:@"CellIWantToSegueFrom"]) { 

    // Do my conditional logic - this was the whole point of changing the segue 
    if (myConditionForSegueIsSatisfied) { 
     // Perform the segue using the identifier I was careful to give it in IB 
     // Note I'm sending the cell as the sender because that's what the normal 
     // segue does and I already had code counting on that 
     [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell]; 
    } 
} 

नोट मैं कैसे segue के साथ सेल भेज - सेल से सामान्य segue कि करता है, और मैं मूल रूप से शून्य पारित किया था, और मेरे कोड है जो इस पर निर्भर था काम करना बंद कर।

+0

जिसने मुझे जरूरी किया। धन्यवाद – Critter

+0

सेक को हटाना, और पुनः जोड़ना कुंजी था - यदि आपने अपनी प्रोजेक्ट बनाने के लिए मास्टर-विवरण टेम्पलेट का उपयोग किया था। धन्यवाद। – Stiefel

+0

इसे UITableViewController से खींचें! वह था ... मैं सोच रहा था कि (प्रोग्रामिक रूप से नहीं) कैसे एक विशिष्ट दृश्य से जुड़ा हुआ एक segue बनाने के लिए। – maganap

5

यह एक पुरानी सवाल और कुछ महान सही जवाब है लेकिन मैं कुछ अतिरिक्त जानकारी पोस्ट करेंगे मैं उपयोगी महसूस किया जब मैं इस का सामना करना पड़ा:

  1. आप सीटीएल द्वारा स्टोरीबोर्ड में एक segue बनाते हैं + कुछ एवीसी से दूसरे एवीसी में खींचें, इसे हटा दें।

  2. ऑब्जेक्ट नेविगेटर में, सीटीएल + व्यू कंट्रोलर स्तर पर (आमतौर पर पहले वीसी के नाम के तहत पदानुक्रम में) कुछ एवीसी से दूसरे एवीसी में खींचें। Segue एक अद्वितीय पहचानकर्ता दें।

  3. ऊपर वर्णित अनुसार tableView: didSelectRowAtIndexPath: लागू करें।

  4. मैंने पाया यह उपयोगी महान जवाब हर किसी के लिए tableView: didSelectRowAtIndexPath:

    switch (indexPath.row) { 
    case 0: 
        [self performSegueWithIdentifier:@"yourIDHere" sender:self]; 
        break; 
    case 1: 
        // enter conditional code here... 
        break; 
    case 2: 
        // enter conditional code here... 
        break; 
    // ... for however many cells you require 
    
    default: 
        break; 
    

    में एक switch कथन का उपयोग करने के लिए}

धन्यवाद।

0

आप आसानी से अपने कस्टम UIViewController में किसी भी segue के उद्घाटन के अवसर पर नियंत्रण कर सकते को लागू करने से:

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { return true // or false, depending on what you need }