【问题标题】:modal view controller not calling presenting view controller's dismissModalViewControllerAnimated: method模态视图控制器不调用呈现视图控制器的dismissModalViewControllerAnimated:方法
【发布时间】: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];

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

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

【问题讨论】:

    标签: ios uiviewcontroller uikit modal-dialog


    【解决方案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上设置modalPresentationStyle为UIModalPresentationCurrentContext

    【讨论】:

      【解决方案3】:

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

      [[self presentingViewController] dismissModalViewControllerAnimated: YES];
      

      或

      [self dismissModalViewControllerAnimated: YES];
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 2016-02-03
        相关资源
        最近更新 更多