क्रमिक प्रदर्शन करें और गंतव्य दृश्य के लिए पैरामीटर पास करें


174

मेरे ऐप में मेरे पास एक बटन है जो क्रमिक रूप से एक सेगमेंट करता है:

- (void)myButtonMethod
{
    //execute segue programmatically
    [self performSegueWithIdentifier: @"MySegue" sender: self];
}

मैं यह जानना चाहूंगा कि क्या गंतव्य के संदर्भ को संदर्भित करने और इसे कुछ मापदंडों को पारित करने का कोई तरीका है।

मुझे पता है कि prepareForSegueविधि में, मैं इसके साथ उल्लेख कर सकता हूं: myDestinationViewController *vc = [segue destinationViewController];लेकिन मुझे नहीं पता कि यह कैसे प्रोग्राम को निष्पादित कर रहा है।

आपके पास कोई विचार है?

धन्यवाद, यास्सा


अपडेट करें:

मुझे इस सवाल के लिए खेद है !!! मुझे बस यह पता चला कि, भले ही सेग को प्रोग्रामेटिक रूप से लागू किया गया हो, prepareForSegueविधि को वैसे भी कहा जाता है और इसलिए मापदंडों को उसी तरह से पारित करना संभव है।


44
अद्यतन को उत्तर के रूप में जोड़ें और इसे स्वीकार करें ताकि लोगों को पता
चले

उत्तर जोड़ें, अधिसूचना के लिए टिप्पणी करें।
डेनस्केल

11
आपको नीचे दिए गए उत्तर को सही के रूप में चिह्नित करना चाहिए , इसलिए लोग जानते हैं कि इसका उत्तर दिया जा चुका है।
लिंडन लोमड़ी

जवाबों:


107

इसका उत्तर बस इतना है कि इससे कोई फर्क नहीं पड़ता कि किस तरह से बहस शुरू होती है।

prepareForSegue:sender:विधि किसी भी मामले में कहा जाता है और इस जहां में अपने पैरामीटर पास है।


3
यह अभी भी मुझे परेशान करता है - इसका मतलब है कि मुझे एक जगह पर सेगमेंट को ट्रिगर करना होगा, जहां मेरे पास डेटा है जिसे मैं किसी भी चीज़ से अलग-थलग मापदंडों के रूप में भेजना चाहता हूं, लेकिन उस डेटा को पूरी तरह से अलग जगह पर जोड़ने के लिए - तैयारफॉरसेग, जहां हम पास किए जाने के लिए आवश्यक डेटा के बारे में कुछ भी नहीं पता है। मतलब, मुझे उस डेटा के साथ दो अलग-अलग कार्यों (एक ट्रिगर सेग, अन्य - तैयारी) द्वारा साझा किए गए संदर्भ में एक राज्य बनाना होगा। मैं उस राज्य को गंदा नहीं करना चाहता जब मेरी ज़रूरत है कि कुछ डेटा के साथ एक नया दृश्य खोलना है ...
NeverwinterMoon

गंतव्य वीसी
ट्रैपर

मैंने मान लिया कि प्रेषक में पेलोड को पार करना एक प्रतिमान है। इसमें सिर्फ़ इस बात की जानकारी होनी चाहिए कि किसने सेग को ट्रिगर किया है, न कि डेटा ने जो चीज़ सेग को ट्रिगर किया है वह आगे गुजरने का इरादा रखता है।
नेवरवर्टनमून

प्रेषक पर आधिकारिक डॉक्स से: "यह ऑब्जेक्ट वास्तविक सेगमेंट के दौरान सूचना के प्रयोजनों के लिए उपलब्ध कराया गया है।"
नेवरवर्टनमून

1
हाँ, वास्तविक पेलोड न दें, पास संदर्भ, जैसे सेल / बटन / इंडेक्स / आदि ने सेगमेंट को ट्रिगर किया।
ट्रैपर

90

पुराना सवाल है, लेकिन आप जो पूछ रहे हैं उसे कैसे करें, इस बारे में यहां बताया गया है। इस मामले में मैं एक टेबल व्यू में चयनित सेल से दूसरे व्यू कंट्रोलर का डेटा पास कर रहा हूं।

इनग्रेट दृश्य की .h फ़ाइल:

@property(weak, nonatomic)  NSObject* dataModel;

इन .m फ़ाइल:

@synthesize dataModel;

dataModelहो सकता है string, intया इस मामले की तरह यह एक मॉडल है जिसमें कई आइटम शामिल हैं

- (void)someMethod {
     [self performSegueWithIdentifier:@"loginMainSegue" sender:self];
 }

या ...

- (void)someMethod {
    UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
    [self.navigationController pushViewController: myController animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"storyDetailsSegway"]) {
        UITableViewCell *cell = (UITableViewCell *) sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        NSDictionary *storiesDict =[topStories objectAtIndex:[indexPath row]];
        StoryModel *storyModel = [[StoryModel alloc] init];
        storyModel = storiesDict;
        StoryDetails *controller = (StoryDetails *)segue.destinationViewController;
        controller.dataModel= storyModel;
    }
}

3

स्विफ्ट 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ExampleSegueIdentifier" {
        if let destinationVC = segue.destination as? ExampleSegueVC {
            destinationVC.exampleString = "Example"
        }
    }
}

स्विफ्ट 3:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ExampleSegueIdentifier" {
            if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
                destinationVC.exampleString = "Example"
            }
        }
    }

0

मैं एक स्थान पर सेगमेंट करने और राज्य को बनाए रखने की समस्या को समझने की समस्या को समझने के लिए पैरामीटर तैयार करने के लिए भेजता हूं।

मुझे यह करने का एक तरीका सूझा। मैंने एक श्रेणी का उपयोग करके ViewControllers के लिए userInfoDict नामक एक संपत्ति जोड़ी है। और मैंने ओवरराइड को पहचानकर्ता के साथ भी निष्पादित किया है, इस तरह से कि यदि प्रेषक स्वयं है (इसका मतलब नियंत्रक स्वयं है)। यह इस userInfoDict को अगले ViewController के पास देगा।

यहाँ पूरे UserInfoDict को पास करने के बजाय आप विशिष्ट पैरामेट्स को भी भेज सकते हैं, प्रेषक के अनुसार और उसके अनुसार ओवरराइड कर सकते हैं।

1 बात आपको ध्यान में रखने की जरूरत है। ur PerformSegue पद्धति में सुपर विधि को कॉल करना न भूलें।


0

यदि आप नए स्विफ्ट संस्करण का उपयोग करते हैं।

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ChannelMoreSegue" {

        }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.