Я мог бы быть здесь неуместным, но я начинаю предпочитать блочный синтаксис очень подробному подходу делегата / протокола. Если вы делаете vc2 из vc1, у vc2 есть свойство, которое вы можете установить из vc1, то есть блок!
@property (nonatomic, copy) void (^somethingHappenedInVC2)(NSString *response);
Затем, когда что-то происходит в vc2, о чем вы хотите сообщить vc1, просто выполните блок, который вы определили в vc1!
self.somethingHappenedInVC2(@"Hello!");
Это позволяет отправлять данные из vc2 обратно в vc1. Прямо как по волшебству. IMO, это намного проще / чище, чем протоколы. Блоки - это круто, и их нужно принимать как можно больше.
РЕДАКТИРОВАТЬ - Улучшенный пример
Допустим, у нас есть mainVC, над которым мы хотим временно представить модальныйVC, чтобы получить некоторые данные от пользователя. Чтобы представить этот модальныйVC из mainVC, нам нужно выделить / инициализировать его внутри mainVC. Довольно простые вещи. Когда мы создаем этот модальный объект VC, мы также можем установить для него свойство блока, которое позволяет нам легко взаимодействовать между обоими объектами vc. Итак, возьмем приведенный выше пример и поместим свойство follwing в файл .h modalVC:
@property (nonatomic, copy) void (^somethingHappenedInModalVC)(NSString *response);
Затем в нашем mainVC, после того, как мы разместили / инициализировали новый объект modalVC, вы устанавливаете свойство блока modalVC следующим образом:
ModalVC *modalVC = [[ModalVC alloc] init];
modalVC.somethingHappenedInModalVC = ^(NSString *response) {
NSLog(@"Something was selected in the modalVC, and this is what it was:%@", response);
}
Итак, мы просто устанавливаем свойство блока и определяем, что происходит при выполнении этого блока.
Наконец, в нашем modalVC мы могли бы иметь tableViewController, поддерживаемый массивом строк dataSource. После выбора строки мы можем сделать что-то вроде этого:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *selectedString = self.dataSource[indexPath.row];
self.somethingHappenedInModalVC(selectedString);
}
И, конечно же, каждый раз, когда мы выбираем строку в modalVC, мы собираемся получить вывод консоли из нашей строки NSLog обратно в mainVC. Надеюсь, это поможет!