Я прочитал следующий урок относительно раскадровки.
В основном образец приложения, созданный в этом руководстве, позволяет пользователю перемещаться между различными представлениями, и он создается с помощью segue .
Чтобы перемещаться между представлениями, в учебнике говорят, что нужно создать два UITableViewController и при переходе от одного к другому указать делегата:
Первый контроллер:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"AddPlayer"])
{
UINavigationController *navigationController = segue.destinationViewController;
PlayerDetailsViewController *playerDetailsViewController = [[navigationController viewControllers] objectAtIndex:0];
playerDetailsViewController.delegate = self;
}
}
Второй контроллер:
@protocol PlayerDetailsViewControllerDelegate <NSObject>
- (void)playerDetailsViewControllerDidCancel: (PlayerDetailsViewController *)controller;
- (void)playerDetailsViewController: (PlayerDetailsViewController *)controller didAddPlayer:(Player *)player;
@end
@interface PlayerDetailsViewController : UITableViewController
@property (nonatomic, weak) id <PlayerDetailsViewControllerDelegate> delegate;
При «возвращении»:
- (IBAction)cancel:(id)sender
{
[self.delegate playerDetailsViewControllerDidCancel:self];
}
Мой простой вопрос: почему это осложнение? Зачем использовать делегаты и протоколы?
Я изменил код, используя стиль "Java", и теперь я передаю второй контроллер ссылку на первый, все работает.
Первый контроллер:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
...
playerDetailsViewController.playerViewController = self;
}
Второй контроллер:
@property (strong, readwrite) PlayerViewController *playerViewController;
Итак, каковы преимущества использования делегатов вместо простой передачи ссылок между ViewControllers?
Спасибо!
Guido