如何以模态方式呈现ViewController,然后在ViewController被解除后运行一个回调函数/块,没有Delegate?

时间:2016-06-01 02:30:45

标签: ios swift uiviewcontroller modal-dialog

我只知道在子视图控制器完成动画显示在屏幕上后,self.presentViewController(childVc, animated: true, completion: {})中的完成块被调用。我实际上想要运行一个代码块,在子视图控制器的动画完成动画被解除之后显示。我怎么能这样做,最好避免使用委托来做那件事?

编辑:我从提交的(子)视图控制器中调用它,如下所示:self.presentingViewController.dismissViewControllerAnimated (true) {},但问题是子视图控制器可以从任意页面呈现,并且在子项被解除后,父项(呈现)视图控制器必须做不同的事情。如果我在孩子中实现回调,我就不能对调用它的不同父母做不同的事情。

例如,如果我在新闻界面中将登录表单作为模式调用,则在登录表单解除后,我想在之后显示评论部分。但是如果从产品屏幕以模态方式显示登录表单,我希望之后在购物车中显示用户的购物车。如果没有代表就不可能做到这一点,我仍然对委托解决方案感兴趣。

4 个答案:

答案 0 :(得分:6)

您可以向ChildVC添加属性以存储回调闭包,并在呈现子视图控制器时设置此属性。当子视图控制器解散自身时,它可以调用完成处理程序:

class ChildVC: UIViewController {        
    var completionHandler : ((childVC:ChildVC) -> Void)?

    func dismiss() {
        self.dismissViewControllerAnimated(true) {
            self.completionHandler?(childVC:self)
        }
    }
}

在呈现ChildVC实例时提供完成处理程序:

let completionHandler:(ChildVC)->Void = { childVC in
    print("completed for \(childVC)")
}
childVC.completionHandler=completionHandler
self.presentViewController(childVC, animated: true, completion: nil)

答案 1 :(得分:1)

使用需要完成功能的dismissViewControllerAnimated API。

    self.dismissViewControllerAnimated(true) { 
        /* Do callback stuff here*/
    }

答案 2 :(得分:1)

您可以在呈现的ViewController中创建一个回调块,就像@property(nonatomic,copy)void (^onDimissed)();一样,并在显示的视图控制器调用之后 [self dismissViewControllerAnimated:YES completion:^{ if (self.onDismissed) { self.onDismissed(); } }];
所以你可以在块中返回任何参数 不要忘了这样做
SomeController *ctr = [[UIViewController alloc] init]; ctr.onDimissed = ^{ //some your implementation };

答案 3 :(得分:-1)

如果你使用self.dismissViewControllerAnimated(true, completion: { //Put your code }); 这个返回nil为什么意味着它不支持所有操作系统,所以只需使用下面的代码,

ViewController

如果你关闭@RunWith(CucumberWithSerenity.class) @CucumberOptions(features = "classpath:com/cfhayes/test/LookupADefinition.feature") public class DefinitionTestSuite { public static void main(String[] args) throws Exception { JUnitCore.main("com.cfhayes.test.DefinitionTestSuite"); } } ,你可以调用任何函数将你的代码放在完成处理程序中。

希望它有用