模态视图控制器不调用呈现视图控制器的dismissModalViewControllerAnimated:方法

Posted

技术标签:

【中文标题】模态视图控制器不调用呈现视图控制器的dismissModalViewControllerAnimated:方法【英文标题】:modal view controller not calling presenting view controller's dismissModalViewControllerAnimated: method 【发布时间】:2012-01-18 06:15:17 【问题描述】:

在我的模态视图控制器中,我有一个按钮处理方法,其中包括

[self dismissModalViewControllerAnimated: YES];

在呈现视图控制器中,我重写了dismissModalViewControllerAnimated: 如下:

-(void) dismissModalViewControllerAnimated: (BOOL)animated

  NSLog(@"dismiss");
  [super dismissModalViewControllerAnimated: animated];

当按钮被触摸时,按钮处理方法被调用,但是dismissModalViewControllerAnimated: override 似乎没有被调用:NSLog(@"dismiss");语句没有被调用,方法内的断点也不会被命中。

我试过了

[[self presentingViewController] dismissModalViewControllerAnimated: YES];

但这也没有用。但是,模态视图控制器确实被解除了。

知道可能出了什么问题吗?

【问题讨论】:

【参考方案1】:

这通常通过将呈现视图控制器声明为模态视图控制器的委托来处理。然后模态 VC 在呈现的 VC 中调用一个委托方法来关闭它创建的模态转换。

例子:

模态VC.h:

@protocol ModalViewControllerDelegate
-(void)dismissMyModalViewController;
@end

模态VC.m:

// When you want to dismiss the Modal VC
[delegate dismissMyModalViewController]; 

介绍 VC.h:

// Make sure to #import ModalVC.h
@property (nonatomic, retain) id <ModalViewControllerDelegate> delegate;

介绍 VC.m:

-(void)dismissMyModalViewController 
    [self dismissModalViewControllerAnimated:YES];

【讨论】:

这个委托属性在哪里,它实现了什么协议?我在 UIViewController、UIResponder 或 NSObject 中找不到委托属性。 您添加自己的委托方法,而不是委托属性。我将在答案中提供一个粗略的例子。请稍等。 感谢您抽出宝贵时间回答。我明白你现在在说什么,但我不明白这一点。向 Modal VC 传递指向 Presenting VC 的指针似乎是一种复杂的方法。无论如何,您会从我的回答中看到,问题在于解雇消息被发送到导航控制器,而不是它包含的 UIViewController。 @StephenAshley.developer EIJay 建议使用委托的方式是 Apple 推荐的处理模态 VC 解散的方式,允许呈现的 VC 知道它何时被解散。【参考方案2】:

来自Programming ios 6, by Matt Neuburg:

在 iPad 上,当呈现视图控制器的 modalPresentationStyle 是 UIModalPresentationCurrentContext 时,必须决定哪个视图控制器应该是呈现视图控制器的presentingViewController。这将确定哪个视图将被呈现的视图控制器的视图替换。这个决定涉及另一个 UIViewController 属性,definePresentationContext (a BOOL)。从 presentViewController:animated:completion: 被发送到的视图控制器开始,我们沿着父视图控制器链遍历,寻找其定义PresentationContext 属性为 YES 的视图控制器。如果我们找到一个,那就是那个;它将是presentingViewController,并且它的视图将被呈现的视图控制器的视图替换。如果我们没有找到,事情就像呈现的视图控制器的 modalPresentationStyle 是 UIModalPresentationFullScreen。

TL;DR 1.在所需的presentingViewController上将definesPresentationContext设置为true 2.在所需的presentedViewController上设置modalPresentationStyleUIModalPresentationCurrentContext

【讨论】:

【参考方案3】:

显示模态视图控制器的代码包含在 UIViewController 中,而 UIViewController 又包含在 UINavigationController 中。当我打电话时

[[self presentingViewController] dismissModalViewControllerAnimated: YES];

[self dismissModalViewControllerAnimated: YES];

正在向 UINavigationController 对象发送解除消息。

【讨论】:

以上是关于模态视图控制器不调用呈现视图控制器的dismissModalViewControllerAnimated:方法的主要内容,如果未能解决你的问题,请参考以下文章

模态视图控制器不调用呈现视图控制器的dismissModalViewControllerAnimated:方法

如何从模态视图控制器调用呈现视图控制器的方法

在 View Dismissal 之前调用 Delegate 方法

在模态视图控制器的解除动画时访问presentingViewController

关闭 3 层模态视图

关闭从模态呈现的视图控制器翻转的视图控制器