2012-01-12 15 views
10

के साथ मेरे पास एक सार्वभौमिक ऐप है, जहां मैं एक आईपैड और आईफोन स्टोरीबोर्ड के लिए एक ही नियंत्रक साझा कर रहा हूं। मैं एक UITableView पर एक UILongPressGestureRecognizer डाल दिया है, यह है कि यह एक ऐसी कार्रवाई एक segue प्रदर्शन कॉल जब एक सेल iPhone पर दबाया जाता है:readyForSegue को निष्पादन के बाद नहीं कहा जाता है: withIdentifier: पॉपओवर शैली

-(IBAction)showDetail:(id)sender { 
    UILongPressGestureRecognizer *gesture = (UILongPressGestureRecognizer*)sender; 
    if (gesture.state == UIGestureRecognizerStateBegan) { 
     CGPoint p = [gesture locationInView:self.theTableView]; 

     NSIndexPath *indexPath = [self.theTableView indexPathForRowAtPoint:p]; 
     if (indexPath != nil) { 
      [self performSegueWithIdentifier:SEGUE_DETAIL sender:indexPath]; 
     } 
    } 
} 

segue एक 'पुश' के रूप में प्रदर्शन एक विस्तार दृश्य है। पहली बात यह है कि आपको नोटिस करना चाहिए कि प्रेषक एक एनएसआईएंडएक्सपैथ है, जो चयनित सेल को पार करने के लिए मिला एकमात्र तरीका है। शायद एक बेहतर समाधान है। सब कुछ ठीक काम करता है, एक अर्थ में कि segue किया जाता है, और तैयार करने से पहले फोर्ससेग भी कहा जाता है।

हालांकि ऐसा होता है कि आईपैड पर, मैंने सेग्यू पहचानकर्ता को पॉपओवर में बदल दिया है। अब चीजें काम में काम कर रही हैं, सीगू किया जाता है, लेकिन तैयार करें फॉरसेग्यू नहीं कहा जाता है और इसलिए गंतव्य दृश्य नियंत्रक स्थापित नहीं किया जाना चाहिए।

मैं क्या गलत कर रहा हूं?

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है। viewdidload को बुलाया जाता है लेकिन segue नहीं करता – 1dayitwillmake

उत्तर

20

क्या मैं अब तक की खोज की है, कि किसी भी segue पहचानकर्ता के साथ कि पॉपओवर नहीं है इन आईओएस द्वारा किए गए आमंत्रण हैं: (स्रोत नियंत्रक पर)

  • prepareForSegue
  • viewDidLoad (गंतव्य नियंत्रक पर)

पॉपओवर में जबकि मंगलाचरण आदेश segue है:

  • viewDidLoad (गंतव्य नियंत्रक पर)
  • prepareForSegue (स्रोत नियंत्रक पर)

सिर्फ इसलिए कि मैं viewDidLoad में अपने सभी तर्क रखा, नियंत्रक ठीक से प्रारंभ नहीं किया गया था, और एक दुर्घटना हुआ। तो यह बिल्कुल सही नहीं है कि तैयार करने के लिए फोर्ससेग्यू नहीं कहा जाता है, सच्चाई यह है कि मुझे अपवाद मिल रहा था, और मैंने गलती से गलत तरीके से गलत तरीके से गलत नहीं कहा।

मैं सबकुछ दृश्य में नहीं डाल सका क्योंकि कोरडाटा को कॉल करना था और मैं यह देखना नहीं चाहता था कि प्रत्येक बार व्यू डिस्प्ले प्रदर्शित होता है या नहीं।

मैंने इसे कैसे हल किया? मैं गंतव्य नियंत्रक

-(void)prepareViewController { 
    // initialization logic... 
} 

में एक और तरीका बनाया है और स्रोत नियंत्रक अपने आप में prepareForSegue विधि बदलते:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    MyViewController *mvc = (MyViewController*)[segue destinationViewController]; 
    // passing variable 
    // with segue style other than popover this called first than viewDidLoad 
    [email protected]"prop1"; 
    [email protected]"prop2"; 

    // viewWillAppear is not yet called 
    // so by sending message to controller 
    // the view is initialized 
    [mvc prepareViewController]; 

} 

इस पॉपओवर साथ व्यवहार, वैसे भी अब चीजें काम कर रहे हैं उम्मीद है, तो पता नहीं है।

+0

आपका फिक्स मेरे लिए भी काम करता है, इसलिए धन्यवाद, लेकिन यह एक अजीब मुद्दा है क्योंकि यह केवल मेरे लिए फसल हो गया है, भले ही मेरे पास कई अन्य पॉप ओवर हैं जो ठीक काम करते हैं और तैयार करने पर भरोसा करते हैं। ऑब्जेक्ट्स पर आगे बढ़ने के लिए। – GeoffCoope

+0

यहां वही, कभी-कभी तैयार करें ForSegue को viewDidLoad से पहले बुलाया जाता है, कभी-कभी ... ठीक के लिए धन्यवाद। –

+0

मुझे लगता है कि readyForSegue को ViewDidLoad के बाद बुलाया जाता है जब स्टूडियो से सेग्यू को बुलाया जाता है, और यह दूसरा तरीका है यदि आप इसे मैन्युअल रूप से उपयोग करते हैं -performSegueWithIdentifier:। – gklka

1

मैंने देखा है कि Xcode के मास्टर-विस्तार से टेम्पलेट (iPhone) के लिए बॉयलर प्लेट कोड विस्तार कुलपति की दृष्टि विन्यस्त करने के लिए निम्नलिखित पैटर्न का उपयोग करता है:

  1. विस्तार कुलपति setters (प्रॉपर्टी के लिए) में ओवरराइट कर रहे हैं कॉन्फ़िगरेशन व्यू विधि का आह्वान करने के लिए आदेश (कॉन्फ़िगर व्यू दृश्य में आपके सभी नियंत्रण अपडेट करेगा, उदाहरण के लिए, लेबल इत्यादि।)
  2. विस्तार कुलपति viewDidLoad विधि भी configureView विधि

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

मुझे पॉपओवर के साथ अधिक अनुभव नहीं है; हालांकि, यदि ऊपर दिया गया पैटर्न एक विस्तार वीसी के साथ प्रयोग किया जाता है जो एक पॉपओवर के अंदर प्रदर्शित होता है, तो विवरण VC के दृश्य को कॉन्फ़िगर नहीं किया जाएगा जब आप विवरण VC के गुणों को तैयार करने के लिए तैयार करते हैं ForSegue विधि?