ios 如何检测父视图控制器中模态视图控制器的解除?[duplicate]

d8tt03nd  于 2022-12-24  发布在  iOS
关注(0)|答案(2)|浏览(211)
    • 此问题在此处已有答案**:

10年前关闭了。

    • 可能重复:**

Call Function in Underlying ViewController as Modal View Controller is Dismissed
我几乎什么都试过了。以下是我试过的:

-(void)viewWillAppear:(BOOL)animated
{

NSLog(@"Test");

}

-(void)viewDidAppear:(BOOL)animated
{

NSLog(@"Test");

}

-(void)viewDidLoad
{

NSLog(@"Test");

}

当模态视图控制器被关闭时,为什么这些在我的父视图控制器中都不起作用?我怎样才能让它起作用?

fjaof16o

fjaof16o1#

  • 此答案经过改写/扩展,以解释3种最重要的方法(@galambalazs)*

1.块
最简单的方法是使用回调函数block,如果你只有一个监听器(父视图控制器)对解除事件感兴趣,这是很好的,你甚至可以通过事件传递一些数据。
在 * 主视图控制器. 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];

在 * 第二视图控制器. h * 中

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

在 * 第二视图控制器. m * 中

- (IBAction)close:(id)sender 
{
    [self dismissViewControllerAnimated:YES completion:nil];

    if (self.didDismiss) 
        self.didDismiss(@"some extra data");
}

1.代表团

    • Delegation**是Apple推荐的模式:
    • 关闭显示的视图控制器**

如果呈现的视图控制器必须将数据返回给呈现的视图控制器,请使用委托设计模式来简化传输。委托使在应用的不同部分重用视图控制器变得更加容易。通过委托,呈现的视图控制器存储对委托对象的引用,该对象实现来自正式协议的方法。当它收集结果时,所呈现的视图控制器调用其委托上的那些方法。在典型的实现中,所呈现的视图控制器使其自身成为其所呈现的视图控制器的委托。

    • 主视图控制器**

在 * 主视图控制器. 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");
}
    • 第二个视图控制器**

在 * 第二视图控制器. h * 中

@protocol SecondViewControllerDelegate <NSObject>
- (void)didDismissViewController:(UIViewController*)vc;
@end

@interface SecondViewController : UIViewController
@property (nonatomic, weak) id<SecondViewControllerDelegate> delegate;
// ... other properties
@end
  • 第二视图控制器. m * 中的某个位置
[self.delegate didDismissViewController:self];
[self dismissViewControllerAnimated:YES completion:nil];
  • (注:带didDismissViewController的协议:方法可以在整个应用中重用)*

1.通知
另一个解决方案是发送一个NSNotification。这也是一个有效的方法,如果你只想 * 通知 * 解雇而不传递太多数据,这可能比委托更容易。但它的主要用例是当你想多个侦听器解雇事件(而不仅仅是父视图控制器)。
但请确保总是在完成后将自己从 * NSNotificationCentre * 中删除!否则,即使在您被解除分配后,仍有被调用通知的风险。[编者注]
在 * 主视图控制器. 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");
}

在 * 第二视图控制器. 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];
}
jbose2ul

jbose2ul2#

模态视图应该告诉它的父视图解除它,然后父视图会知道,因为它负责执行解除操作。
如果您创建一个新项目并选择Utility Application模板,就可以看到这样的示例。

相关问题