当前位置: 首页 > 知识库问答 >
问题:

检测何时解除显示的视图控制器

阎涵容
2023-03-14

比方说,我有一个名为VC2的视图控制器类的实例。在VC2中,有一个“cancel”(取消)按钮会自动关闭。但当“取消”按钮触发时,我无法检测或接收任何回调。VC2是一个黑匣子。

视图控制器(称为VC1)将使用呈现视图控制器:动画:完成方法呈现VC2。

VC1在VC2被解除时必须检测哪些选项?

编辑:从@rory mckinnel的评论和@NicolasMiari的回答中,我尝试了以下方法:

在VC2中:

-(void)cancelButton:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:^{

    }];
//    [super dismissViewControllerAnimated:YES completion:^{
//        
//    }];
}

在VC1中:

//-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
- (void)dismissViewControllerAnimated:(BOOL)flag
                           completion:(void (^ _Nullable)(void))completion
{
    NSLog(@"%s ", __PRETTY_FUNCTION__);
    [super dismissViewControllerAnimated:flag completion:completion];
//    [self dismissViewControllerAnimated:YES completion:^{
//        
//    }];
}

但是没有调用VC1中的dismissViewControllerAnimated。

共有3个答案

杭泉
2023-03-14

使用块特性

在VC2中声明

var onDoneBlock : ((Bool) -> Void)?

VC1中的设置

VC2.onDoneBlock = { result in
    // Do something
}

当您要解雇时,请致电VC2

onDoneBlock!(true)
严劲
2023-03-14

根据文档,呈现控制器负责实际解雇。当呈现的控制器解雇自己时,它会要求演示者为它做这件事。因此,如果您在VC1控制器中覆盖dismisViewControlllerAnimated,我相信当您在VC2上点击取消时它会被调用。检测解雇,然后调用将执行实际解雇的超级类版本。

从讨论中发现,这似乎不起作用。与其依赖底层机制,不如在VC2本身上调用dismissViewControllerAnimated:completion,而在self上调用dismissViewControllerAnimated:completion。在VC2中显示ViewController。这将直接调用您的覆盖。

更好的方法是让VC2提供一个在模态控制器完成时调用的块。

因此,在VC2中,提供一个块属性,例如名称为onDoneBlock。

在VC1中,您呈现如下:

>

  • 在VC1中,创建VC2

    将VC2的完成处理程序设置为:<代码>VC2。onDoneBlock={[VC2 dismissViewControllerAnimated:YES completion:nil]}

    使用[自我呈现视图控制器:VC2动画:是完成:无]正常呈现VC2控制器;

    在VC2中,在取消目标操作调用中。onDoneBlock()

    结果是VC2告诉提出它的人它已经完成。您可以扩展onDoneBlock以包含指示模态是否已完成、取消、成功等的参数......

  • 赖渊
    2023-03-14

    UIViewController中有一个特殊的布尔属性,名为isbeingdisabled,可用于此目的:

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if isBeingDismissed {
            // TODO: Do your stuff here.
        }
    }
    
     类似资料:
    • 场景:用户点击视图控制器上的按钮。视图控制器是导航堆栈中的最顶层(显然)。tap调用在另一个类上调用的实用程序类方法。那里发生了一件坏事,我想在控件返回视图控制器之前在那里显示一个警报。 这在中是可能的(但可能不太合适)。 在这种情况下,您如何呈现一个,就在中?

    • 问题内容: 我正在构建一个带有angular + ionic的应用程序,该应用程序在底部使用一个经典的三按钮菜单,其中包含三个ion- tabs。用户单击选项卡时,该模板通过ui-router打开。 我有这样的状态: 在模板中,我执行以下操作: 我知道我可以在控制器中编写doSomething()函数,并在那里手动调用它。那给了我同样的问题。每当有人打开该视图时,我似乎都无法弄清楚如何调用doSo

    • 我有一个导航视图控制器,它会在操作时向选项卡栏视图控制器发送一个序列。因此,选项卡式视图控制器继承了导航栏。我正在尝试将标题应用于连接到选项卡栏视图控制器的其中一个视图控制器,但通过代码设置标题对我不起作用。有人知道为什么会这样吗? 这是我的故事板的图片: 带有注销按钮的视图控制器是我试图在导航条(代码)中设置标题的地方: 导航控制器中嵌入的视图控制器触发到选项卡栏控制器的顺序:

    • 问题内容: 我有一个非标准的Spring MVC项目。用XML响应。是否可以创建一个视图(jsp页面),以显示所有接受的(不是必需的)控制器,映射和参数。 根据答案,我有: 我没有得到任何信息 问题答案: 随着Spring 3.1,你可以轻松浏览端点。 The controller : The view : 你也可以在Spring <3.1中使用代替。但是你不会获得相同级别的信息。 有了它们,你将

    • 我的应用程序支持英语和阿拉伯语。我正在使用UIView。外观()。semanticContentAttribute属性在RTL到LTR之间更改,反之亦然,如下所示。 我正在使用self.present呈现日历事件EKEventEditViewController()(eventController,动画:true,完成:nil)。我想总是LTR显示这个屏幕。 我尝试了以下代码,但当我将语言更改为阿

    • 问题内容: 在我的视图控制器代码中,我该如何区分: 模态呈现 推入导航堆栈 这两个和是在这两种情况下,所以都不是很有益的。 使事情变得复杂的是,我的父视图控制器有时是模态的,将要检查的视图控制器推到该模态上。 事实证明,我的问题是,我嵌入我的,然后呈现。这就是为什么我自己的尝试和下面的好答案无法正常工作的原因。 我想我最好告诉我的视图控制器何时是模态的,而不是试图确定。 问题答案: 拿一粒盐,没有