কীভাবে পাসফোরসিগ পাস করবেন: একটি অবজেক্ট


357

আমার মানচিত্রের ভিউতে অনেকগুলি টিকা আছে ( rightCalloutAccessoryবোতামগুলি সহ)। বোতাম এই থেকে একটি segue সঞ্চালন করা হবে mapviewএকটি করতে tableviewtableviewকোন কলআউট বোতামটি ক্লিক করা হয়েছিল তার উপর নির্ভর করে আমি একটি ভিন্ন অবজেক্ট (যা ডেটা ধারণ করে) পাস করতে চাই ।

উদাহরণস্বরূপ: (সম্পূর্ণভাবে তৈরি)

  • টিকা 1 (অস্টিন) -> তথ্য আপত্তি 1 পাস (অস্টিনের সাথে প্রাসঙ্গিক)
  • টিকা 2 (ডালাস) -> তথ্য পাস 2 (ডালাস সম্পর্কিত)
  • টিকা 3 (হিউস্টন) -> ডেটা আপত্তি 3 এবং আরও পাস করুন ... (আপনি ধারণাটি পাবেন)

কোন কলআউট বোতামটি ক্লিক করা হয়েছিল তা সনাক্ত করতে সক্ষম হয়েছি।

আমি ব্যবহার করছি prepareForSegue: গন্তব্যে তথ্য আপত্তি করতে ViewController। যেহেতু আমি এই কলটি আমার প্রয়োজনীয় ডেটা আপত্তিটির জন্য অতিরিক্ত যুক্তি নিতে পারি না, একই প্রভাব (গতিশীল ডেটা আপত্তি) অর্জনের জন্য কিছু মার্জিত উপায় কী?

যে কোনও টিপ প্রশংসা করা হবে।


উত্তর:


673

কেবল prepareForSegue:পদ্ধতিতে লক্ষ্য ভিউ কন্ট্রোলারের একটি রেফারেন্স ধরুন এবং সেখানে আপনার যে কোনও অবজেক্ট প্রয়োজন। এখানে একটি উদাহরণ ...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
    {
        // Get reference to the destination view controller
        YourViewController *vc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [vc setMyObjectHere:object];
    }
}

পুনর্বিবেচনা: আপনি performSegueWithIdentifier:sender:একটি নির্বাচন বা বোতাম টিপসের উপর নির্ভর করে একটি নতুন ভিউতে স্থানান্তর সক্রিয় করতে পদ্ধতিটিও ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, বিবেচনা করুন আমার দুটি ভিউ কন্ট্রোলার ছিল। প্রথমটিতে তিনটি বোতাম রয়েছে এবং দ্বিতীয়টিতে संक्रमणগুলির আগে এই বোতামগুলির মধ্যে কোনটি টিপানো হয়েছে তা জানতে হবে। আপনি আপনার কোডটিতে একটি পর্যন্ত বাটনগুলি তারের করতে পারেন IBActionযা performSegueWithIdentifier:পদ্ধতি ব্যবহার করে ...

// When any of my buttons are pressed, push the next view
- (IBAction)buttonPressed:(id)sender
{
    [self performSegueWithIdentifier:@"MySegue" sender:sender];
}

// This will get called too before the view appears
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"MySegue"]) {

        // Get destination view
        SecondView *vc = [segue destinationViewController];

        // Get button tag number (or do whatever you need to do here, based on your object
        NSInteger tagIndex = [(UIButton *)sender tag];

        // Pass the information to your destination view
        [vc setSelectedButton:tagIndex];
    }
}

সম্পাদনা: আমি মূলত সংযুক্ত ডেমো অ্যাপ্লিকেশনটি এখন ছয় বছরের পুরানো, সুতরাং কোনও বিভ্রান্তি এড়াতে আমি এটিকে সরিয়েছি।


আপনাকে ধন্যবাদ তবে আমি [vc setMyObjectHere:object];এটিকে গতিশীলভাবে সেট করতে চাই । বাটন 1 এর জন্য অজেক্ট 1, বাটন 2 এর জন্য আপত্তি 2 সমস্যাটি হচ্ছে আমি কোনও যুক্তিটি পাস করতে পারি না this এদিকে কোনও উপায় আছে কি?
শীতল শীঘ্রই

2
আমি যা বলছি তার ডাউনলোডযোগ্য উদাহরণ সহ আমার পোস্টটি আপডেট করেছি updated
সাইমন

যে কাজ! একটি গুচ্ছ ধন্যবাদ। পার্শ্ব নোটের প্রস্তুতি হিসাবে শিওগু: এর একটি ইউআইসিসিআরটল যুক্তি রয়েছে যা ইউআইবাটন এর মূল পিতা বর্গ (এইভাবে ট্যাগ পেতে সক্ষম): ডি
শিহরিত

এমনকি স্টোরিবোর্ড সিগ ছাড়া আপনার নেভিগেশন কন্ট্রোলারে কেবল চাপ দেওয়ার পরেও কি কি ফোরফেরসিগ বলা হয়?
জাকদানস

এটি আমি দেখেছি সবচেয়ে গভীর উত্তরগুলির মধ্যে একটি। ভাল কোড নমুনা, সমস্যা সমাধান করে, ডাউনলোডযোগ্য নমুনা সরবরাহ করে ... বাহ! আমি অভিভূত!
লেবিগেজ

82

কখনও কখনও দুটি ভিউ কন্ট্রোলারের মধ্যে একটি সংকলন-সময় নির্ভরতা তৈরি এড়াতে সহায়ক। গন্তব্য দেখার নিয়ন্ত্রকের ধরণের যত্ন না নিয়ে আপনি এটি কীভাবে করতে পারেন তা এখানে:

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

যতক্ষণ না আপনার গন্তব্য দেখার নিয়ামক একটি সর্বজনীন সম্পত্তি ঘোষণা করে, যেমন:

@property (nonatomic, strong) MyData *myData;

আমি উপরে বর্ণিত হিসাবে আপনি পূর্ববর্তী ভিউ নিয়ন্ত্রকের মধ্যে এই সম্পত্তি সেট করতে পারেন।


12
এটি সত্যই মতামত একটি বিষয়। আমি (এখনও) এমন পরিস্থিতি পাইনি যেখানে আমি ভিউ কন্ট্রোলারগুলিকে 'শক্তভাবে' নিয়ন্ত্রণ করতে চাইনি, যদিও আপনি যা বলছেন তা আমি উপলব্ধি করি এবং এটি সঠিক পরিস্থিতিতে গুরুত্বপূর্ণ হতে পারে।
সাইমন

2
@ সিমন: হ্যাঁ, আপনি কেবল সেই পদ্ধতির চয়ন করুন যা আপনার পক্ষে সেরা। উদাহরণস্বরূপ, অ্যাপটিতে আমি এখন কাজ করছি, আমার দৃষ্টিভঙ্গি অনেক অর্থবোধ করে, যেহেতু আমি একইভাবে ডেটা অবজেক্টের প্রয়োজন এমন ভিউ কন্ট্রোলার যুক্ত করতে থাকি। তাদের কেবল মাত্র একটি সেগুন দিয়ে জড়িয়ে রাখতে সক্ষম হওয়া এবং তারা সঠিক ডেটা পাবেন তা জেনে রাখা অত্যন্ত সুবিধাজনক।
ম্যাকন্ডো 2 সিটেল

10
এটি মতের বিষয় নয়, এটি কেবল ভুল :) এই শব্দটি "গৃহীত উত্তর এটি করার সর্বোত্তম উপায় নয়" ভুল। এটি পড়তে হবে "নির্দিষ্ট কিছু ক্ষেত্রে, আপনার এটি করা দরকার ..."
ফ্যাটি

2
আমি সাইমন এর পদ্ধতি পছন্দ। এটি সংকলনের সময় ত্রুটিগুলি আমাকে বলবে। উদাহরণস্বরূপ, যদি আমি গন্তব্য ভিউ কন্ট্রোলারে আমার ডেটা ঘোষণাটি মিস করি তবে আমি অবিলম্বে জানব। তবে আপনার দৃশ্যের জন্য, আপনার পদ্ধতিরটি ভাল বলে মনে হচ্ছে!
আব্দুররহমান মুবেন আলী

14
আপনি অবশ্যই গন্তব্য দেখার জন্য নিয়ন্ত্রকের একটি থাকা প্রয়োজন বলে এই পদ্ধতির বিষয়টি একেবারে নির্ভরতা তৈরি করে setMyData:। এটি একটি নির্ভরতা। সংকলন ত্রুটি এড়াতে আপনি নির্বাচককে যে সত্য ব্যবহার করেন তা আপনার সুবিধার পরিবর্তে আপনার পদ্ধতির দুর্বলতা হিসাবে বিবেচিত হওয়া উচিত । এটি আমার জন্য অবাক করে দেওয়া হয়েছে যে কতগুলি বিকাশকারী এই ধারণাটি হারিয়েছেন যে সময়কালীন ত্রুটিগুলি সংকলন করার জন্য রান-টাইম ত্রুটিগুলি পছন্দ করা উচিত।
নাট

21

সুইফটে 4.2 এ আমি এরকম কিছু করব:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let yourVC = segue.destination as? YourViewController {
        yourVC.yourData = self.someData
    }
}

আপনার কি কল করতে হবে: `সুপার.প্রেপার (জন্য: সেগু, প্রেরক: প্রেরক)`?
অ্যান্ড্রু কে

16

আমার এই প্রেরকের ক্লাস রয়েছে

@class MyEntry;

@interface MySenderEntry : NSObject
@property (strong, nonatomic) MyEntry *entry;
@end

@implementation MySenderEntry
@end

আমি এই প্রেরক ক্লাসটি অবজেক্টগুলিতে পাস করার জন্য ব্যবহার করিprepareForSeque:sender:

-(void)didSelectItemAtIndexPath:(NSIndexPath*)indexPath
{
    MySenderEntry *sender = [MySenderEntry new];
    sender.entry = [_entries objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:SEGUE_IDENTIFIER_SHOW_ENTRY sender:sender];
}

-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_SHOW_ENTRY]) {
        NSAssert([sender isKindOfClass:[MySenderEntry class]], @"MySenderEntry");
        MySenderEntry *senderEntry = (MySenderEntry*)sender;
        MyEntry *entry = senderEntry.entry;
        NSParameterAssert(entry);

        [segue destinationViewController].delegate = self;
        [segue destinationViewController].entry = entry;
        return;
    }

    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_HISTORY]) {
        // ...
        return;
    }

    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_FAVORITE]) {
        // ...
        return;
    }
}

আমরা ব্যবহার prepareForSegue অথবা আমরা হয় বাস্তবায়নে এটি এবং ধৃষ্টতা prepareForSegue নিজেই নামক পরার অর্থাৎ আমরা হয় না ভালো কিছু করতে প্রয়োজন[self prepareForSegue]
মধু

15

আমি এই প্রশ্নটি জুড়ে এসেছি যখন আমি কীভাবে একজন ভিউ কন্ট্রোলার থেকে অন্য ভিউতে ডেটা পাস করতে হয় তা শিখতে চেষ্টা করি। যদিও আমাকে শিখতে সহায়তা করার জন্য আমার কাছে ভিজ্যুয়াল কিছু দরকার, তাই এই উত্তরটি ইতিমধ্যে অন্যদের জন্য পরিপূরক। এটি আসল প্রশ্নের চেয়ে কিছুটা সাধারণ তবে এটি কাজের সাথে খাপ খাইয়ে নেওয়া যেতে পারে।

এই মৌলিক উদাহরণটি এর মতো কাজ করে:

এখানে চিত্র বর্ণনা লিখুন

প্রথম ভিউ কন্ট্রোলারের পাঠ্য ক্ষেত্র থেকে দ্বিতীয় দফার নিয়ন্ত্রকের লেবেলে একটি স্ট্রিং সরবরাহ করা ধারণা।

প্রথম দেখুন নিয়ামক

import UIKit

class FirstViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    // This function is called before the segue
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        // get a reference to the second view controller
        let secondViewController = segue.destinationViewController as! SecondViewController

        // set a variable in the second view controller with the String to pass
        secondViewController.receivedString = textField.text!
    }

}

দ্বিতীয় দেখুন নিয়ামক

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    // This variable will hold the data being passed from the First View Controller
    var receivedString = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        // Used the text from the First View Controller to set the label
        label.text = receivedString
    }

}

মনে রেখ

  • দ্বারা segue করুন controlবোতামে ক্লিক এবং এটি দ্বিতীয় দেখুন কন্ট্রোলার হাতে draging।
  • জন্য কারেন্টের হুক আপ UITextFieldএবং UILabel
  • আইবিতে যথাযথ সুইফ্ট ফাইলগুলিতে প্রথম এবং দ্বিতীয় দেখুন নিয়ন্ত্রকদের সেট করুন।

সূত্র

সিগু (সুইফ্ট) (ইউটিউব টিউটোরিয়াল) এর মাধ্যমে ডেটা কীভাবে প্রেরণ করা যায়

আরো দেখুন

কন্ট্রোলারগুলি দেখুন: ডেটা ফরোয়ার্ড করা এবং ডেটা ফেরানো (পূর্ণ উত্তর)


5

সুইফ্ট এটি ব্যবহারের জন্য ,

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var segueID = segue.identifier

    if(segueID! == "yourSegueName"){

        var yourVC:YourViewController = segue.destinationViewController as YourViewController

        yourVC.objectOnYourVC = setObjectValueHere!

    }
}

4

আমি ইউআইভিউউকন্ট্রোলারের একটি বিভাগ সহ একটি লাইব্রেরি প্রয়োগ করেছি যা এই ক্রিয়াকলাপটিকে সহজতর করে। মূলত, আপনি যে পরামিতিগুলি সেগমেন্টটি সম্পাদন করছেন এমন UI আইটেমের সাথে সম্পর্কিত এনএসডিকোরিয়ায় পাস করতে চান set এটি ম্যানুয়াল সেগগুলি নিয়েও কাজ করে।

উদাহরণস্বরূপ, আপনি করতে পারেন

[self performSegueWithIdentifier:@"yourIdentifier" parameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

ম্যানুয়াল সেগের জন্য বা সেগ এবং ব্যবহারের সাথে একটি বোতাম তৈরি করুন

[button setSegueParameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

গন্তব্য দর্শন নিয়ামক যদি কোনও কী-এর জন্য কী-মান কোডিং মেনে চলতে না থাকে তবে কিছুই ঘটে না। এটি কী-মানগুলির সাথেও কাজ করে (আনইন্ডাইড বিভাগগুলির জন্য দরকারী)। এটি এখানে দেখুন https://github.com/stefanomondino/SMQuickSegue


2

আমার সমাধানও একই রকম।

// In destination class: 
var AddressString:String = String()

// In segue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   if (segue.identifier == "seguetobiddetailpagefromleadbidder")
    {
        let secondViewController = segue.destinationViewController as! BidDetailPage
        secondViewController.AddressString = pr.address as String
    }
}

1

শুধু এই ফাংশন ব্যবহার করুন।

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let index = CategorytableView.indexPathForSelectedRow
    let indexNumber = index?.row
    let VC = segue.destination as! DestinationViewController
   VC.value = self.data

}

0

আমি এই সমাধানটি ব্যবহার করেছি যাতে আমি সিগির অনুরোধ এবং ডেটা যোগাযোগ একই ফাংশনের মধ্যে রাখতে পারি:

private var segueCompletion : ((UIStoryboardSegue, Any?) -> Void)?

func performSegue(withIdentifier identifier: String, sender: Any?, completion: @escaping (UIStoryboardSegue, Any?) -> Void) {
    self.segueCompletion = completion;
    self.performSegue(withIdentifier: identifier, sender: sender);
    self.segueCompletion = nil
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.segueCompletion?(segue, sender)
}

ব্যবহারের ক্ষেত্রে এরকম কিছু হবে:

func showData(id : Int){
    someService.loadSomeData(id: id) {
        data in
        self.performSegue(withIdentifier: "showData", sender: self) {
            storyboard, sender in
            let dataView = storyboard.destination as! DataView
            dataView.data = data
        }
    }
}

এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে, তবে আমি 100% নিশ্চিত নই যে সম্পাদন এবং প্রস্তুত কার্যগুলি সর্বদা একই থ্রেডে চালিত হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.