2012-01-01 6 views
7

सबसे पहले, एक छोटी सी पृष्ठभूमि। मैं आईओएस विकास के लिए नया हूं, मैं लंबे समय से नेट भूमि में रहा हूं, और शायद यही कारण है कि मैं यह सवाल भी पूछ रहा हूं, लेकिन यहां जाता है।एक दृश्य नियंत्रक से दूसरे डेटा को पास करना; आईओएस <= 4 बनाम आईओएस 5

मूल सेटअप यह है। आपके पास UINavigationController है RootViewController के साथ हम MasterViewController पर कॉल करेंगे। जब इस मास्टर व्यू कंट्रोलर पर कुछ कार्रवाई होती है, तो हम DetailsViewController में ड्रिल करना चाहते हैं। हालांकि, हम कुछ डेटा DetailsViewController पर भी पास करना चाहते हैं।

यह मेरी समझ है, कि एसडीके के पिछले संस्करणों में (आईओएस 5 से पहले) दृष्टिकोण यह करने के लिए समान था:

@implementation MasterViewController 

    -(IBAction)someAction 
    { 
     DetailsViewController *dvc = [[DetailsViewController alloc]initWithNibName:@"DetailsView" bundle:nil]; 
     dvc.someDataProp = [self getSomeDataSomeHow]; 
     [[self navigationController] pushViewController:dvc animated:YES]; 
    } 

@end 

अब तथापि, iOS 5 में, ऐसा लगता है कि यह अब किया जाता है स्टोरीबोर्ड और segues का उपयोग कर। XCode में आप DetailsViewController को MasterViewController से segue की स्थापना की, और उसके बाद कोड में आप कुछ इस तरह करते हैं:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    [segue.destinationViewController setSomeDataProp:[self getSomeDataSomeHow]]; 
} 

मेरा प्रश्न मूल रूप से यह है: पुराने दृष्टिकोण किसी भी तरह एक बहुत मेरे लिए क्लीनर लगता है। आप ViewController के प्रकार के बारे में बहुत स्पष्ट हैं, आप नेविगेशन स्टैक पर जा रहे हैं और आप आसानी से गुण सेट कर सकते हैं। नए दृष्टिकोण में, destinationViewController प्रकार id (स्पष्ट कारणों से) है, और यह मुझे बहुत कम साफ महसूस करता है। दोबारा, यह मेरा नेट पक्ष हो सकता है, लेकिन यह आईओएस में आम है? बस आईडी का उपयोग करें और हवा में सावधानी बरतें?

+1

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

उत्तर

6

स्टोरीबोर्ड के साथ आप segue के लिए नामित पहचानकर्ता असाइन कर सकते हैं, सेग्यू का चयन करें और विशेषता निरीक्षक में आप segue Identifier में एक नाम जोड़ सकते हैं।

और तैयार में फोर्ससेग विधि आपको इस पहचानकर्ता के लिए जांच करनी चाहिए और इस प्रकार आप स्पष्ट रूप से जान लेंगे कि कौन सी सीगू करने जा रही है और गंतव्य दृश्य नियंत्रक क्या होगा।

if ([segue.identifier isEqualToString:@"My First Segue Identifier"]) 
{  
    DetailsViewController *dvc = (DetailsViewController *) segue.destinationViewController; 
    // Set the DVC's properties 
} 
+0

बेहतर है, लेकिन आपके पास अभी भी उस बदसूरत कास्ट है। क्या यह पसंदीदा दृष्टिकोण है? – BFree

+0

यह पसंदीदा दृष्टिकोण है। आप सही हैं, पुराना तरीका स्पष्ट और अधिक स्पष्ट है। नई विधि के साथ आप स्टोरीबोर्ड में "हुकिंग" कर रहे हैं। दुर्भाग्यवश, केवल स्टोरीबोर्ड में पाए गए नए फीचर्स हैं जो इसे XIB डिज़ाइनर में नहीं बनाते हैं, जैसे नए स्थिर और गतिशील UITableView डिजाइनर समर्थन। –

+1

क्या यह कोड स्निपेट 'readyForSegue' विधि के भीतर डाली गई है? – chwi

4

कई मामलों में, एक segue के लिए गंतव्य दृश्य नियंत्रक एक UINavigationViewController हो सकता है, और उस स्थिति में, समाधान (ऊपर डेनिस मैथ्यूज 'समाधान के एक मामूली संशोधन) संदेश "topViewController" का उपयोग करने की आवश्यकता होगी :

if ([segue.identifier isEqualToString:@"My First Segue Identifier"]) 
{  
    NavitationViewController* navController = [segue destinationViewController]; 
    DetailsViewController *dvc = (DetailsViewController*) [navController topViewController] 
    // Set the DVC's properties 
} 
+0

यह मेरे लिए चाल है, सिवाय इसके कि मुझे लगता है कि "NavitationViewController * navController" के बजाय आपको "UINavigationController * navController" का अर्थ है। – mpemburn

1

मैं आईओएस कि लंबे समय के साथ काम नहीं किया गया है, लेकिन मैं जहां उद्देश्य-सी के ढीला युग्मित संदेश प्रणाली की वजह से कास्ट करने के लिए की जरूरत नहीं है कुछ उदाहरण देखा है।

इसके बजाय segue पहचानकर्ता जाँच या एक विशिष्ट ViewController के लिए कास्टिंग के आप यह कर सकते हैं: पहली पंक्ति में

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.destinationViewController respondsToSelector: @selector(setCompany:)]) { 
     [segue.destinationViewController performSelector: @selector(setCompany:) withObject: self.company]; 
    } 
} 

मैं पूछना अगर destinationViewController एक विधि setCompany है (यदि आप एक संपत्ति नामित कंपनी इस अगर एक आपके लिए उत्पन्न होगा)। यदि ऐसा होता है, तो आप उस विधि को कॉल कर सकते हैं/उस कोड को कोड की दूसरी पंक्ति के साथ सेट कर सकते हैं।

इसलिए इस मामले में आपको वास्तव में गंतव्य व्यू कंट्रोलर को जानना नहीं है और आसानी से इसे अलग-अलग कंपनियों के साथ बदल सकता है जो कंपनियों को संभालने में सहायता करता है।