2011-11-07 17 views
19

के साथ प्रतिनिधि को कैसे सेट करें मैं थोड़ी देर के लिए इस पर बहस कर रहा हूं, उम्मीद है कि आप मेरी मदद कर सकते हैं।स्टोरीबोर्ड

मैं स्टोरीबोर्ड का उपयोग करके एक ऐप बना रहा हूं, मेरे पास एक बिंदु है जहां मैं एक नया रिकॉर्ड जोड़ने के लिए एक मॉडल बॉक्स पॉप अप करता हूं, पॉपअप ठीक काम करता है, समस्या इसे खारिज कर रही है।

मैं कैसे करने के लिए ठीक से करीब मोडल प्रतिनिधियों का उपयोग कर बक्से पर एप्पल के निर्देशों का पालन किया, और कहा कि ठीक काम करता है, को छोड़कर मैं अपने मोडल बॉक्स के लिए एक नेविगेशन नियंत्रक जोड़ने की जरूरत है, क्योंकि ऐड प्रक्रिया दो चरणों (यहाँ fullscreen) की आवश्यकता है:

enter image description here

समस्या प्रतिनिधि स्थापित करने में निहित है, इसलिए यहाँ मेरे दो प्रश्न हैं:

1- मेरी जड़ दृश्य वर्ग (मेरे टैब) में जोड़ने के वर्ग (मोडल) के एक प्रतिनिधि है , सबकुछ ठीक से स्थापित किया गया है:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 
     [[segue destinationViewController] setDelegate:self]; 

    } 
} 

समस्या यह है कि [segue destinationViewController] में निहित है navigationController और नहीं AddDrinkViewController वर्ग (स्टोरीबोर्ड देखें) लौटा रहा है। मैं इसके आसपास कैसे पहुंचू? अगर मैं नेविगेशन नियंत्रक को पूरी तरह से हटा देता हूं, तो कोड उपयुक्त प्रतिनिधि को ठीक से सेट करता है।

2- क्या स्टोरीबोर्ड में आउटलेट खींचकर प्रतिनिधि सेट करने का कोई तरीका है?

धन्यवाद!

+0

मैं एक मॉडल के प्रतिनिधि को सेट करने के लिए हर जगह खोज रहा हूं। उस कोड के लिए बहुत बहुत धन्यवाद। हाहा – MattAitchison

उत्तर

13

आप सही हैं, destinationViewController इस मामले में UINavigationController होगा। मैं इस सामान्य स्थिति को संभालने के लिए एक वर्ग ने लिखा है:

[[segue topLevelDestinationViewController] setDelegate:self] 
// another example: 
MyViewController *vc = segue.topLevelDestinationViewController; 
vc.delegate = self; // etc. 
:

// category .h file 
@interface UIStoryboardSegue (NavControllerExtensions) 
// Gets destinationViewCotroller. But if that controller 
// is a NavigationController, returns the nav controller's 
// top level view controller instead. 
@property (readonly) id topLevelDestinationViewController; 
@end 

// category .m file 
@implementation UIStoryboardSegue (NavControllerExtensions) 
- (id)topLevelDestinationViewController 
{ 
    id dest = self.destinationViewController; 
    if ([dest isKindOfClass:[UINavigationController class]]) { 
    UINavigationController* nav = dest; 
    dest = nav.topViewController; 
    } 
    return dest; 
} 
@end 

तो अब आप सिर्फ अपने prepareForSegue तरीकों में से किसी में यह कर सकते हैं, और नहीं के बारे में चिंता करने की जरूरत भी एक NavigationController मौजूद है कि क्या वहाँ

अपने दूसरे प्रश्न का उत्तर देने के लिए, मुझे आईबी के भीतर प्रतिनिधि को सेट करने का कोई तरीका नहीं मिला।

9

मैं मेरे मामले में एक छोटा रास्ता (तुम्हारा के रूप में ही) में पाया गया:

AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0]; 
+1

अच्छा! एक आकर्षण की तरह मेरी समस्या हल! – iDroid

+0

बिल्कुल सही, मेरी समस्या भी हल हो गई। समझ में नहीं आया कि मैं अन्य दृश्य नियंत्रकों के गुणों का संदर्भ क्यों दे सकता हूं जो एक ही एनवी नियंत्रक का उपयोग करते हैं, लेकिन जो अन्य का उपयोग नहीं करते हैं। ओह! –

+0

अच्छा। यह मेरे लिए चाल थी। स्मार्ट समाधान –

4

मूल रूप से आप इसे
को UINavigationController के
उदाहरण destinationViewController बना सकते हैं और निर्दिष्ट करेंगे और इसके Topview नियंत्रक हड़पने के लिए की जरूरत है

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 

    UINavigationController *navigationController = segue.destinationViewController; 
    AddDrinkViewController *addDrinkcontroller = (AddDrinkViewController *)navigationController.topViewController; 

    addDrinkcontroller.delegate = self; 

    } 
}