Этот ответ был переписан / расширен для объяснения 3 наиболее важных подходов ( @ galambalazs )
1.Блоки
Самый простой подход - использовать обратный вызов block
.Это хорошо, если у вас есть только один слушатель (родительский контроллер представления), заинтересованный в увольнении.Вы даже можете передать некоторые данные с событием.
In MainViewController.m
SecondViewController* svc = [[SecondViewController alloc] init];
svc.didDismiss = ^(NSString *data) {
// this method gets called in MainVC when your SecondVC is dismissed
NSLog(@"Dismissed SecondViewController");
};
[self presentViewController:svc animated:YES completion:nil];
In SecondViewController.h
@interface MainViewController : UIViewController
@property (nonatomic, copy) void (^didDismiss)(NSString *data);
// ... other properties
@end
In SecondViewController.m
- (IBAction)close:(id)sender
{
[self dismissViewControllerAnimated:YES completion:nil];
if (self.didDismiss)
self.didDismiss(@"some extra data");
}
2.Делегирование
Delegation
является рекомендуемым шаблоном Apple:
Отклонение контроллера представленного представления
Если представленный контроллер представлений должен возвращать данные в представляющий контроллер представлений, используйте шаблон проектирования Delegation , чтобы упростить передачу.Делегирование упрощает повторное использование контроллеров представления в разных частях вашего приложения.С делегированием представленный контроллер представления хранит ссылку на объект делегата, который реализует методы из формального протокола .По мере сбора результатов представленный контроллер представления вызывает эти методы для своего делегата.В типичной реализации представляющий контроллер представления делает себя делегатом своего представленного контроллера представления.
MainViewController
In MainViewController.h
@interface MainViewController : UIViewController <SecondViewControllerDelegate>
- (void)didDismissViewController:(UIViewController*)vc;
// ... properties
@end
Где-то в MainViewController.m (представление)
SecondViewController* svc = [[SecondViewController alloc] init];
svc.delegate = self;
[self presentViewController:svc animated:YES completion:nil];
Где-то еще в MainViewController.m (рассказывается оувольнение)
- (void)didDismissViewController:(UIViewController*)vc
{
// this method gets called in MainVC when your SecondVC is dismissed
NSLog(@"Dismissed SecondViewController");
}
SecondViewController
In SecondViewController.h
@protocol SecondViewControllerDelegate <NSObject>
- (void)didDismissViewController:(UIViewController*)vc;
@end
@interface SecondViewController : UIViewController
@property (nonatomic, weak) id<SecondViewControllerDelegate> delegate;
// ... other properties
@end
Где-то в SecondViewController.m
[self.delegate myActionFromViewController:self];
[self dismissViewControllerAnimated:YES completion:nil];
(примечание: протокол с didDismissViewController: метод может быть повторно использован в вашем приложении)
3.Уведомления
Другим решением является отправка NSNotification
.Это также правильный подход, он может быть проще делегирования, если вы хотите уведомить об увольнении без передачи большого количества данных.Но это основной случай использования, когда вы хотите несколько слушателей для события исключения (кроме только родительского контроллера представления).
Но убедитесь, что всегда удалите себяс NSNotificationCentre после того, как вы закончите!В противном случае вы рискуете потерпеть неудачу, будучи вызванным для уведомлений даже после того, как вас освободили. [примечание редактора]
In MainViewController.m
- (IBAction)showSecondViewController:(id)sender
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
[self presentViewController:secondVC animated:YES completion:nil];
// Set self to listen for the message "SecondViewControllerDismissed"
// and run a method when this message is detected
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(didDismissSecondViewController)
name:@"SecondViewControllerDismissed"
object:nil];
}
- (void)dealloc
{
// simply unsubscribe from *all* notifications upon being deallocated
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)didDismissSecondViewController
{
// this method gets called in MainVC when your SecondVC is dismissed
NSLog(@"Dismissed SecondViewController");
}
In SecondViewController.m
- (IBAction)close:(id)sender
{
[self dismissViewControllerAnimated:YES completion:nil];
// This sends a message through the NSNotificationCenter
// to any listeners for "SecondViewControllerDismissed"
[[NSNotificationCenter defaultCenter]
postNotificationName:@"SecondViewControllerDismissed"
object:nil userInfo:nil];
}
Надеюсь, это поможет!