Lakukan Segue secara terprogram dan berikan parameter ke tampilan tujuan

174

di aplikasi saya, saya memiliki tombol yang melakukan segue secara terprogram:

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

Saya ingin tahu apakah ada cara untuk merujuk tampilan tujuan dan memberikannya beberapa parameter.

Saya tahu bahwa dalam prepareForSeguemetode, saya dapat merujuknya dengan:, myDestinationViewController *vc = [segue destinationViewController];tapi saya tidak tahu bagaimana cara mengeksekusi segue ini secara terprogram.

Apakah Anda punya ide?

Terima kasih, yassa


MEMPERBARUI:

Maaf atas pertanyaan ini !!! Saya hanya menemukan bahwa, bahkan jika segue dipanggil secara terprogram, prepareForSeguemetode ini dipanggil pula dan karena itu dimungkinkan untuk melewatkan parameter dengan cara yang biasa sama.

yassassin
sumber
44
Tambahkan pembaruan sebagai jawaban dan terima sehingga orang tahu ini telah dijawab :)
danielbeard
Tambahkan jawaban, komentar untuk pemberitahuan.
DanSkeel
11
Anda harus menandai jawaban di bawah ini sebagai benar, sehingga orang tahu bahwa itu telah dijawab.
lindon fox

Jawaban:

107

Jawabannya sederhana bahwa tidak ada bedanya bagaimana segue dipicu.

The prepareForSegue:sender:metode ini disebut dalam hal apapun dan ini adalah di mana Anda melewati parameter Anda di.

penjebak
sumber
3
Ini masih mengganggu saya - ini berarti saya harus memicu segue di satu tempat, di mana saya memiliki data yang ingin saya kirim sebagai parameter yang diisolasi dengan baik dari yang lain, tetapi untuk menambahkan data itu di tempat yang sama sekali berbeda - prepForSegue, tempat kami tidak tahu apa-apa tentang data yang perlu dikirimkan. Artinya, saya harus membuat status dengan data tersebut dalam konteks yang dibagi oleh dua fungsi yang berbeda (satu memicu segue, yang lain - mempersiapkan). Saya tidak ingin mengotori keadaan saat yang saya butuhkan adalah membuka tampilan baru dengan beberapa data ...
NeverwinterMoon
Gunakan pengirim untuk menyampaikan konteks yang diperlukan untuk mengonfigurasi VC tujuan
trapper
Saya berasumsi bahwa mengoper muatan di pengirim adalah anti-pola. Seharusnya hanya berisi info tentang siapa yang memicu segue, bukan data bahwa hal yang memicu segue dimaksudkan untuk meneruskan lebih lanjut.
NeverwinterMoon
Dari dokumen resmi pada pengirim: "Objek ini tersedia untuk tujuan informasi selama segue yang sebenarnya."
NeverwinterMoon
1
Ya jangan meneruskan muatan yang sebenarnya, lewati konteks, seperti sel / tombol / indeks / dll yang memicu segue.
penjebak
90

Pertanyaan lama tetapi inilah kode tentang bagaimana melakukan apa yang Anda minta. Dalam hal ini saya meneruskan data dari sel yang dipilih dalam tampilan tabel ke pengontrol tampilan lain.

dalam file .h dari tampilan trget:

@property(weak, nonatomic)  NSObject* dataModel;

dalam file .m:

@synthesize dataModel;

dataModeldapat berupa string,, intatau seperti dalam kasus ini adalah model yang berisi banyak item

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

ATAU...

- (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;
    }
}
pengguna1723341
sumber
3

Swift 4:

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

Swift 3:

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

Saya mengerti masalah melakukan segue di satu tempat dan mempertahankan status untuk mengirim parameter sebagai persiapan untuk segue.

Saya menemukan cara untuk melakukan ini. Saya telah menambahkan properti bernama userInfoDict ke ViewControllers menggunakan kategori. dan saya telah mengesampingkan melakukan segue dengan pengidentifikasi juga, sedemikian rupa sehingga Jika pengirim adalah diri (berarti controller itu sendiri). Ini akan meneruskan userInfoDict ini ke ViewController berikutnya.

Di sini, alih-alih meneruskan seluruh UserInfoDict Anda juga dapat melewati params tertentu, sebagai pengirim dan menimpanya.

1 hal yang perlu Anda ingat. jangan lupa untuk memanggil metode super di metode performSegue Anda.

karthik1729
sumber
0

Jika Anda menggunakan versi cepat baru.

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

        }
}
Pokotuz
sumber