PerformSegueWithIdentifier и sharedData
Надеюсь, я не прошу что-то, на что уже ответили (но я не нашел ответа на это, так что надеюсь, что нет).
У меня есть приложение в текущей версии xcode, используя segues и navigationController. Мне нужно передать данные с одного взгляда на другой - какой самый простой способ сделать это? Я наткнулся на какую-то вещь sharedData, которую можно было бы подключить к методу executeSegueWithIdentifier, но не знаю, как ее использовать (или это правильный выбор для этого).
Спасибо
Ответы
Ответ 1
У segue есть два контроллера вида: sourceViewController
и destinationViewController
. Когда UIKit выполняет segue, он отправляет сообщение 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];
}
Это объясняется в видеоролике Знакомство с построителем интерфейсa > от WWDC 2011.
Также стоит отметить, что когда источником segue является ячейка просмотра таблицы или вспомогательная кнопка ячейки таблицы, аргумент sender
prepareForSegue:sender:
является ячейкой представления таблицы.
Ответ 2
Я думаю, что лучший способ - импортировать заголовок для контроллера вида, который будет отображаться в контроллере, который выполняет 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 delegate method,controller
// ie. used to return data after second view is dismissed
- (void)secondControllerFinishedSomeTask:(NSArray *)someReturnedData {
// Do something with returned data
}
Ответ 3
Если вам нужны данные от второго до первого, лучше использовать использовать Unwind Segues.