我只知道在子视图控制器完成动画显示在屏幕上后,self.presentViewController(childVc, animated: true, completion: {})
中的完成块被调用。我实际上想要运行一个代码块,在子视图控制器的动画完成动画被解除之后显示。我怎么能这样做,最好避免使用委托来做那件事?
编辑:我从提交的(子)视图控制器中调用它,如下所示:self.presentingViewController.dismissViewControllerAnimated (true) {}
,但问题是子视图控制器可以从任意页面呈现,并且在子项被解除后,父项(呈现)视图控制器必须做不同的事情。如果我在孩子中实现回调,我就不能对调用它的不同父母做不同的事情。
例如,如果我在新闻界面中将登录表单作为模式调用,则在登录表单解除后,我想在之后显示评论部分。但是如果从产品屏幕以模态方式显示登录表单,我希望之后在购物车中显示用户的购物车。如果没有代表就不可能做到这一点,我仍然对委托解决方案感兴趣。
答案 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");
}
}
,你可以调用任何函数将你的代码放在完成处理程序中。
希望它有用