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

视图控制器(称为VC1)将使用presentViewController:animated:completion:方法呈现VC2.

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

编辑:根据@Rory McKinnel的 comments 和@NicolasMiari的回答,我try 了以下几种方式:

在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人没有接到电话.

推荐答案

根据文件,演示控制员负责实际解雇.当呈现的控制器自行解散时,它将要求演示者为其执行此操作.因此,如果您覆盖VC1控制器中的dismissViewControllerAnimated,我相信当您在VC2上单击Cancel时会调用它.检测解除,然后调用超类版本,它将执行实际的解除.

从讨论中发现,这似乎不起作用.不依赖于底层机制,而不是在VC2本身上调用dismissViewControllerAnimated:completion,而是在VC2中调用self.presentingViewController上的dismissViewControllerAnimated:completion.然后,这将直接呼叫您的覆盖.

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

因此,在vc2中,提供一个名称为onDoneBlock的挡路属性.

在VC1中,您的演示如下所示:

  • 在VC1中,创建VC2

  • 将VC2的完成处理程序设置为:VC2.onDoneBlock={[VC2 dismissViewControllerAnimated:YES completion:nil]};

  • 使用[Self Presentation ViewController:VC2 Animated:YES COMPLETION:NIL]正常呈现VC2控制器;

  • 在VC2中,在取消目标动作调用self.onDoneBlock();

结果是VC2告诉任何提出它的人它已经完成了.您可以将onDoneBlock扩展为具有参数,这些参数指示模式是否完成、取消、成功等.

Ios相关问答推荐

在选项卡内列出导航内视图断开导航标题的动画

如果条件不满足,S从@ViewBuilder返回什么?

分配给指针会通过 class_addMethod 导致 EXC_BAD_ACCESS

在 iOS 上启用明文本地流量在 .NET MAUI 中不起作用

在 SwiftUI 中,绑定应该放在 ViewModel 中吗?

如何在应用程序中显示我的小部件的快照?

使用 Apollo 发布 iOS 应用程序时缺少推送通知权利

卡在 Apple 的 SwiftUI 教程第 5 章(更新应用数据)

满足条件时 SwiftUI 动画背景 colored颜色 变化

在 iPad 上删除列表的顶部和底部行

在向我的 struct 添加属性后获取线程 10:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

快速禁用 UITextfield 的用户输入

UIScrollview 获取touch 事件

如何在导航栏右侧添加多个 UIBarButtonItem?

Got Unrecognized selector -replacementObjectForKeyedArchiver: 在 Swift 中实现 NSCoding 时崩溃

Swift tableView 分页

如何从一个特定的视图控制器中隐藏导航栏

如何比较两个 UIImage 对象

在 Swift 中上传带参数的图像

使用 Chrome DevTools 调试 iOS 6+7 Mobile Safari