如何在Swift中使用dismissViewControllerAnimated中的完成处理程序?

时间:2016-05-12 15:28:47

标签: ios objective-c swift uiviewcontroller

在将一个应用程序从Objective-C重构为Swift时,我遇到了一个问题,我无法自行解决。

ViewControllerOne有方法
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender。在这种方法中,我设置destinationViewController
ViewControllerTwo *viewControllerTwo = [segue destinationViewController];
和一些这样的块处理程序:

[viewControllerTwo setHandlerOne:^(id sender) {
    [...]
}]

然后在触摸按钮时,我正在显示模态视图。 在模态视图控制器ViewControllerTwo中,我将关闭此模态视图:

- (IBAction)buttonPressed:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
    self.handlerOne(sender);
}

在Swift代码中,我设置了相同的内容:
ViewControllerOne方法:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
设置destinationViewController
let vc = segue.destinationViewController as! ViewControllerTwo
代码块:

vc.setHandlerOne { () -> Void in
    [...]
}

这样我就会收到错误Value of type 'ViewControllerTwo' has no member 'setHandlerOne'。我在这里错过了什么?我是否必须在viewControllerTwo

中手动设置它

2 个答案:

答案 0 :(得分:0)

我认为你的destinationViewController不是ViewControllerTwo类型,或者如果你的destinationViewController是ViewControllerTwo类型,那么ViewControllerTwo可能不包含setHandlerOne方法。

答案 1 :(得分:0)

在Swift中你可以做你所描述的:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {  
    if let viewControllerTwo: ViewControllerTwo = segue.destinationViewController as? ViewControllerTwo{
        viewControllerTwo.setHandler({ (sender) in

        })
    }
}

并在ViewControllerTwo中定义方法:

func setHandler(completion:((AnyObject?) -> Void)?){

}

我发布了带有完成块的版本......