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.


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.


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;
    }
}

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"
            }
        }
    }

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.


0

Jika Anda menggunakan versi cepat baru.

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

        }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.