Segue'i programlı olarak gerçekleştirin ve parametreleri hedef görünüme geçirin


174

benim app programlı bir segue gerçekleştiren bir düğme var:

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

Hedef görünümü başvuru ve bazı parametreleri geçmek için bir yol olup olmadığını bilmek istiyorum.

Ben de biliyorum prepareForSegueyöntemle, beraber kendisine başvurabilirsiniz: myDestinationViewController *vc = [segue destinationViewController];ancak bu programlı segue yürütülmesi nasıl bilmiyorum.

Hiç fikrin var mı?

Teşekkürler yassa


GÜNCELLEME:

Bu soru için özür dilerim !!! Segue programlı olarak çağrılsa bile, prepareForSegueyöntemin yine de çağrıldığını ve böylece parametreleri her zamanki gibi geçirmenin mümkün olduğunu keşfettim .


44
Güncellemeyi bir cevap olarak ekleyin ve insanların bunun yanıtlandığını bilmesi için kabul edin :)
danielbeard

Cevap ekleyin, bildirim için yorum yapın.
DanSkeel

11
Aşağıdaki cevabı doğru olarak işaretlemelisiniz , böylece insanlar cevaplandığını biliyor.
Lindon Fox

Yanıtlar:


107

Cevap basitçe segue'in nasıl tetiklendiğini farketmemesidir.

prepareForSegue:sender:Yöntem her durumda denir ve bu genelinde parametreleri geçirmek yerdir.


3
Bu hala beni rahatsız ediyor - bu, başka bir şeyden güzel bir şekilde izole edilmiş parametreler olarak göndermek istediğim verilere sahip olduğum bir yerde segue tetiklemem gerektiği anlamına geliyor, ancak bu verileri tamamen farklı bir yere eklemek için - preparForSegue, iletilmesi gereken veriler hakkında hiçbir şey bilmiyorum. Yani, iki farklı fonksiyon (bir tetikleyici selam, diğeri - hazırlama) tarafından paylaşılan bağlamda söz konusu verilerle bir durum yaratmalıyım. İhtiyacım olan bazı verilerle yeni bir görünüm açmak olduğunda durumu kirli istemiyorum ...
NeverwinterMoon

Hedef VC'yi yapılandırmak için gereken içeriği iletmek için göndereni kullanın
trapper

Gönderende yararlı yükü geçmenin bir anti-desen olduğunu varsaydım. Sadece segue'i kimin tetiklediğiyle ilgili bilgileri içermelidir, segue'i tetikleyen şeyin daha fazla geçmek istediği verileri değil.
NeverwinterMoon

Göndericideki resmi dokümanlardan: "Bu nesne, fiili segue sırasında bilgilendirme amaçlıdır."
NeverwinterMoon

1
Evet, gerçek bir yükü, bağlamı geçmeyin, hangi hücre / düğme / dizin / vb.
Tuzakçı

90

Eski soru ama burada sorduğunuz şeyi nasıl yapacağınıza dair kod. Bu durumda, tablo görünümündeki seçili bir hücreden başka bir görünüm denetleyicisine veri aktarıyorum.

trget görünümünün .h dosyasında:

@property(weak, nonatomic)  NSObject* dataModel;

.m dosyasında:

@synthesize dataModel;

dataModelolabilir string, intya da bu durumda gibi çok sayıda öğe içeren bir model

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

VEYA...

- (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

Hızlı 4:

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

Hızlı 3:

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

0

Segue'in bir yerde gerçekleştirilmesi ve segue için hazırlık için parametrelerin gönderilmesi için devletin sürdürülmesi problemini anlıyorum.

Bunu yapmanın bir yolunu buldum. Bir kategori kullanarak ViewControllers için userInfoDict adlı bir özellik ekledim. ve ben gönderen kendini ise (denetleyicinin kendisi anlamına gelir) şekilde tanımlayıcı ile segue gerçekleştirmek geçersiz kıldım. Bu userInfoDict öğesini bir sonraki ViewController öğesine iletir.

Burada tüm UserInfoDict'i geçmek yerine, belirli parametreleri, gönderen olarak geçirebilir ve buna göre geçersiz kılabilirsiniz.

Aklınızda bulundurmanız gereken 1 şey. ur performSegue yönteminde süper yöntemi çağırmayı unutmayın.


0

Yeni hızlı sürüm kullanıyorsanız.

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

        }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.