Я міг би бути тут не до місця, але я починаю набагато більше віддавати перевагу синтаксису блоків перед дуже багатослівним підходом делегатів / протоколів. Якщо ви створюєте vc2 з vc1, маєте властивість vc2, яку ви можете встановити з vc1, яка є блоком!
@property (nonatomic, copy) void (^somethingHappenedInVC2)(NSString *response);
Потім, коли у vc2 відбувається щось, про що ви хочете повідомити vc1, просто виконайте блок, який ви визначили у vc1!
self.somethingHappenedInVC2(@"Hello!");
Це дозволяє надсилати дані з vc2 назад на vc1. Так само, як магія. IMO, це набагато простіше / чистіше, ніж протоколи. Блоки чудові і їх потрібно охоплювати якомога більше.
EDIT - покращений приклад
Скажімо, у нас є mainVC, який ми хочемо представити modalVC поверх тимчасово, щоб отримати якийсь вхід від користувача. Для того, щоб представити цей modalVC від mainVC, нам потрібно виділити / ініціювати його всередині mainVC. Досить базові речі. Ну, коли ми робимо цей об'єкт modalVC, ми також можемо встановити для нього властивість блоку, що дозволяє нам легко спілкуватися між обома об'єктами 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. Сподіваюся, це допоможе!