如何检测父视图控制器中的模式视图控制器的解雇?

可能重复:
作为模态视图控制器的底层ViewController中的调用函数被解除

我尝试了几乎所有的东西。 以下是我所尝试的:

-(void)viewWillAppear:(BOOL)animated { NSLog(@"Test"); } -(void)viewDidAppear:(BOOL)animated { NSLog(@"Test"); } -(void)viewDidLoad { NSLog(@"Test"); } 

为什么没有这些工作在我的父视图控制器时,模式视图控制器被解雇? 我怎样才能使这个工作?

这个答案被重写/扩展来解释3个最重要的方法( @ galambalazs )

1.块

最简单的方法是使用callbackblock 。 如果你只有一个监听器 (父视图控制器)对解雇感兴趣,这很好。 你甚至可以通过事件传递一些数据。

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]; 

SecondViewController.h中

 @interface MainViewController : UIViewController @property (nonatomic, copy) void (^didDismiss)(NSString *data); // ... other properties @end 

SecondViewController.m中

 - (IBAction)close:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; if (self.didDismiss) self.didDismiss(@"some extra data"); } 

2.授权

Delegation是苹果推荐的模式:

拒绝提出的视图控制器

如果呈现的视图控制器必须将数据返回给呈现视图控制器,则使用委托devise模式来促进传输。 委托可以更轻松地在应用程序的不同部分重用视图控制器。 使用委托,所呈现的视图控制器存储对从正式协议实现方法的委托对象的引用。 当它收集结果时,呈现的视图控制器在其委托上调用这些方法。 在一个典型的实现中,呈现视图控制器使自己成为其呈现的视图控制器的代表。

MainViewController

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

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中移除! 否则,即使在您被释放之后,您也可能被通知调用而崩溃。 [编者注]

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"); } 

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]; } 

希望这可以帮助!

模态视图应该告诉它的父母解雇它,然后父母会知道,因为它是负责解雇。

如果您创build一个新项目并selectUtility Application模板,就可以看到这个例子。

Interesting Posts