当应用程序进入后台时如何关闭模态视图控制器

4

当应用程序进入后台时,我需要自动关闭我的uiimagepicker模态视图控制器。我尝试将dismissmodalviewcontroller代码放在viewdiddissappear方法中,但它没有被调用。所以我在appdelegate中引用了这个viewcontroller,并尝试将其放在applicationdidenterbackground方法中,但仍然不起作用。有人可以指出正确的做法吗?


当应用程序再次进入前台时,解除对话框怎么样? - Till
如果可能的话,它本身就可以在appdidenterbackground中工作。 - sujith1406
如果您将dismiss代码放在以模态方式呈现uiimagepicker的视图控制器的viewWillDisappear中,是否相同? - Sefran2
请发布您显示UIImagePickerController的代码。 - Black Frog
3个回答

7
尝试在你想要关闭的UIViewController中添加一个NSNotificationCenter观察者,观察UIApplicationDidEnterBackgroundNotification事件。使用选择器来关闭模态视图。
- (void)viewWillAppear:(BOOL)animated
{
   [[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(didEnterBackground:) 
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
   [[NSNotificationCenter defaultCenter] removeObserver: self
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:nil];
}

- (void)didEnterBackground:(NSNotification*)note
{
  [self.navigationController dismissModalViewAnimated:NO];
}

2

在应用程序移动到后台时,最好的方法是删除模态框,这样可以很好地解决问题。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(dismissView:)
                                                 name:UIApplicationDidEnterBackgroundNotification object:nil];
} 

- (void)dismissView:(id)sender {
     [self dismissModalViewControllerAnimated:YES];
}

- (void)dealloc {

     [[NSNotificationCenter defaultCenter] removeObserver:self];
}

您可以使用以下方法来取消观察者:
 [[NSNotificationCenter defaultCenter] removeObserver: self
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:nil];

1

我觉得你不需要经历那一切。

文档中:

如果您连续显示多个模态视图控制器,从而建立了一个模态视图控制器的堆栈,调用此方法将在堆栈中比该子视图控制器更低的视图控制器上解除其直接子视图控制器以及这个子视图控制器之上的所有视图控制器。

尝试在您实现的父视图控制器中从 - (void) viewDidUnload 调用 [self dismissModalViewController:NO]

这个方法没有经过测试,但文档暗示它应该适合您的需求。


2
已在模态视图控制器堆栈的第一个上进行测试,完美运行。 - n_b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接