Виконайте програму Segue програмно та передайте параметри подання пункту призначення


174

у моєму додатку у мене є кнопка, яка виконує програмування:

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

Мені хотілося б знати, чи є спосіб посилання на подання пункту призначення та передати йому деякі параметри.

Я знаю, що в prepareForSegueметоді я можу посилатися на це за допомогою:, myDestinationViewController *vc = [segue destinationViewController];але я не знаю, як це виконати програмування програмно.

У вас є ідеї?

Спасибі, ясса


ОНОВЛЕННЯ:

Вибачте за це питання !!! Я просто виявив, що, навіть якщо програмне забезпечення викликається на segue, prepareForSegueметод все одно викликається, і таким чином можна передавати параметри таким же звичним способом.


44
Додайте оновлення як відповідь і прийміть його, щоб люди знали, що на це відповіли :)
danielbeard

Додати відповідь, коментар для повідомлення.
DanSkeel

11
Ви повинні позначити відповідь нижче як правильну, щоб люди знали, що на неї відповіли.
линдонська лисиця

Відповіді:


107

Відповідь просто в тому, що немає значення, як спрацьовує сегм.

prepareForSegue:sender:Метод викликається в будь-якому випадку , і це, коли ви передаєте свої параметри в поперечнику.


3
Це все ще мене турбує - це означає, що я маю викликати segue в одному місці, де у мене є дані, які я хочу надіслати як параметри, добре відокремлені від будь-чого іншого, але додати ці дані в зовсім іншому місці - PripravForSegue, де ми не знаю нічого про дані, необхідні для передачі. Це означає, що я повинен створити стан з цими даними в контексті, поділеному двома різними функціями (одна викликає розпал, інша - готується). Я не хочу забруднити стан, коли все, що мені потрібно, це відкрити новий погляд з деякими даними ...
NeverwinterMoon

Використовуйте відправника для передачі контексту, необхідного для налаштування пункту призначення VC
trapper

Я припускав, що передача корисного навантаження у відправника є антидіаграмою. Він повинен містити інформацію про те, хто спровокував виразку, а не дані про те, що те, що викликало вираз, має намір пройти далі.
NeverwinterMoon

З офіційних документів про відправника: "Цей об'єкт стає доступним для інформаційних цілей під час фактичної трансляції".
NeverwinterMoon

1
Так, не передавайте фактичну корисну навантаження, пропускайте контекст, як, наприклад, яка комірка / кнопка / індекс / тощо викликала сег.
трапер

90

Старе питання, але ось код про те, як робити те, що ви запитуєте. У цьому випадку я передаю дані з вибраної комірки у вигляді таблиці до іншого контролера перегляду.

у .h-файлі представлення Trget:

@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

Я розумію проблему виконання segue в одному місці та підтримання стану для надсилання параметрів під час підготовки до segue.

Я придумав спосіб це зробити. Я додав властивість під назвою userInfoDict до ViewControllers за допомогою категорії. і я переосмислюю також виконувати segue з ідентифікатором, таким чином, що якщо відправник самостійно (означає сам контролер). Він передасть цього користувачаInfoDict наступному ViewController.

Тут замість того, щоб передавати весь UserInfoDict, ви також можете передавати певні параметри, як відправник, так і заміняти відповідно.

1 річ, про яку потрібно пам’ятати. не забудьте зателефонувати за супер методом в ur performSegue методом.


0

У разі використання нової швидкої версії.

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

        }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.