2011-12-10 7 views
16

मुझे उम्मीद है कि मैं कुछ ऐसा नहीं पूछ रहा हूं जिसका उत्तर पहले ही दिया गया है (लेकिन मुझे इसका कोई जवाब नहीं मिला, इसलिए उम्मीद है कि मैं नहीं हूं)।performSegueWithIdentifier और साझा डेटा

मेरे पास segues और navigationController का उपयोग करते हुए वर्तमान xcode संस्करण में एक ऐप है। मुझे डेटा को एक दृश्य से दूसरे में पास करने की आवश्यकता है - ऐसा करने का सबसे आसान तरीका क्या है? मैं कुछ साझाडेटा चीज़ पर भाग गया जिसे संभवतः प्रदर्शन सेगुएडविथ इंडेंटिफायर विधि पर लगाया जा सकता है लेकिन यह नहीं पता कि इसका उपयोग कैसे किया जाए (या यह ऐसा करने का सही विकल्प है)।

धन्यवाद

+1

यदि आप अपना असली नाम उपयोग करना चाहते हैं, तो अपना उपयोगकर्ता नाम संशोधित करें, पोस्ट में अतिरिक्त पंक्ति न डालें। :) – mac

उत्तर

35

एक segue दो दृश्य नियंत्रक है: sourceViewController और destinationViewController। जब UIKit एक सेग्यू निष्पादित करता है, तो यह स्रोत VC पर prepareForSegue:sender: संदेश भेजता है। गंतव्य वीसी में डेटा पास करने के लिए आप अपने व्यू कंट्रोलर सबक्लास में उस विधि को ओवरराइड कर सकते हैं।

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

@implementation MasterViewController 

... 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    DetailViewController *detailVC = segue.destinationViewController; 
    NSIndexPath *selectedPath = [self.tableView indexPathForSelectedRow]; 
    detailVC.movie = [self movieForIndexPath:selectedPath]; 
} 

यह WWDC 2011

यह भी ध्यान देने योग्य है से Introducing Interface Builder Storyboarding वीडियो में विस्तार से बताया जाता है कि जब segue की उत्पत्ति एक तालिका दृश्य सेल, या तालिका दृश्य सेल के सहायक बटन, sender तर्क है prepareForSegue:sender: तालिका दृश्य कक्ष है।

10

मुझे लगता है कि दृश्य नियंत्रक के लिए शीर्षलेख आयात करना सबसे अच्छा तरीका है जो नियंत्रक में दिखाया जाएगा जो सेगू कर रहा है। और फिर prepareForSegue अंदर आवश्यक डेटा पारित करने के लिए उपयोग करते हैं यह accessors या अन्य तरीकों:

// In FirstViewController.h 

#import "SecondViewController.h" 
#import "SecondViewControllerDelegate.h" 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) { 

     SecondViewController *secondController = [segue destinationViewController]; 

     // Declare first view controller as a delegate 
     secondController.delegate = self; 

     // Pass data 
     secondController.dataArray = self.someDataArray; 
     secondController.name = @"Fancy name"; 
    } 
} 

// Second controller's delegate method,controller 
// ie. used to return data after second view is dismissed 
- (void)secondControllerFinishedSomeTask:(NSArray *)someReturnedData { 
    // Do something with returned data 
} 
+0

रास्ता शांत, धन्यवाद दोस्तों! – Ondrej

2

जब आप डेटा वापस चाहते हैं:

// In FirstViewController.h 

#import "SecondViewController.h" 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) { 
     // Get destination view controller and don't forget 
     // to cast it to the right class 
     SecondViewController *secondController = [segue destinationViewController]; 
     // Pass data 
     secondController.dataArray = self.someDataArray; 
     secondController.name = @"Fancy name"; 
    } 
} 

आप पहली बार के लिए दूसरे से वापस डेटा चाहते हैं, तो मैं प्रतिनिधि का उपयोग करने का सुझाव दूसरे से पहले, बेहतर तरीका use Unwind Segues है।

संबंधित मुद्दे