executeSegueWithIdentifier и sharedData - PullRequest
       3

executeSegueWithIdentifier и sharedData

16 голосов
/ 10 декабря 2011

Надеюсь, я не спрашиваю что-то, на что уже был дан ответ (но я не нашел ответа на этот вопрос, поэтому, надеюсь, что нет).

У меня есть приложение в текущей версии xcode, использующее seguesи навигационный контроллер.Мне нужно передать данные из одного представления в другое - какой самый простой способ сделать это?Я столкнулся с некоторой вещью sharedData, которую можно было бы подключить к методу executeSegueWithIdentifier, но не знаю, как его использовать (или это правильный выбор, чтобы делать это так).

Спасибо

Ответы [ 3 ]

34 голосов
/ 10 декабря 2011

В segue есть два контроллера вида: sourceViewController и destinationViewController.Когда UIKit выполняет переход, он отправляет сообщение prepareForSegue:sender: в исходный VC.Вы можете переопределить этот метод в своем подклассе контроллера представления для передачи данных в целевой VC.

Например, предположим, что у вас есть контроллер основного представления с табличным представлением фильмов, и когда пользователь щелкает строку вВ табличном представлении вы хотите перейти к контроллеру подробного представления для фильма.

@implementation MasterViewController

...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    DetailViewController *detailVC = segue.destinationViewController;
    NSIndexPath *selectedPath = [self.tableView indexPathForSelectedRow];
    detailVC.movie = [self movieForIndexPath:selectedPath];
}

Это объясняется в Представлении раскадровки Interface Builder видео с WWDC 2011.

Стоит также отметить, что когда источником перехода является ячейка табличного представления или вспомогательная кнопка ячейки табличного представления, аргумент sender prepareForSegue:sender: является ячейкой табличного представления.

10 голосов
/ 10 декабря 2011

Я думаю, что лучший способ - импортировать заголовок для контроллера представления, который будет отображаться в контроллере, выполняющем segue.А затем используйте его методы доступа или другие методы для передачи необходимых данных внутри prepareForSegue:

// In FirstViewController.h

#import "SecondViewController.h"

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) {
        // Get destination view controller and don't forget
        // to cast it to the right class
        SecondViewController *secondController = [segue destinationViewController];
        // Pass data
        secondController.dataArray = self.someDataArray;
        secondController.name = @"Fancy name";
    }
}

Когда вы хотите вернуть данные со второго на первое, я предлагаю использовать делегат:

// In FirstViewController.h

#import "SecondViewController.h"
#import "SecondViewControllerDelegate.h"

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) {

        SecondViewController *secondController = [segue destinationViewController];

        // Declare first view controller as a delegate
        secondController.delegate = self;

        // Pass data
        secondController.dataArray = self.someDataArray;
        secondController.name = @"Fancy name";
    }
}

// Second controller's delegate method,controller
// ie. used to return data after second view is dismissed
- (void)secondControllerFinishedSomeTask:(NSArray *)someReturnedData {
    // Do something with returned data
}
2 голосов
/ 28 августа 2013

Если вы хотите вернуть данные со второго на первое, лучшим способом будет использовать Unwind Segues .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...