在 iOS 11 中,UIViewController 的 transitionFromViewController 从不调用它的完成块

Posted

技术标签:

【中文标题】在 iOS 11 中,UIViewController 的 transitionFromViewController 从不调用它的完成块【英文标题】:In iOS 11 , UIViewController's transitionFromViewController never calls its completion block 【发布时间】:2017-09-28 17:20:41 【问题描述】:

ios 11 开始,UIViewControllertransitionFromViewController:toViewController:duration:options:animations:completion: 方法似乎不再调用其完成块。

下面的示例代码sn-p:

[self addChildViewController:toVC];

[fromVC willMoveToParentViewController:nil];

[self transitionFromViewController:fromVC
toViewController:toVC
duration:0.4
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^
completion:^(BOOL finished) 
    NSLog(@"Completion called"); // this completion is never executed
];

这导致我在正确转换视图和动画方面遇到各种问题。有没有其他人遇到过这种行为,和/或发现了解决方法?

【问题讨论】:

【参考方案1】:

事实证明,在将toVC 作为子视图控制器添加到self 之后,我并没有明确地将toVC.view 作为子视图添加到self.view。奇怪的是,这在 iOS 11 与以前的版本中表现不同,但这成功了:

[self addChildViewController:toVC];
[self.view addSubview:toVC.view]; // This line is what is needed

[fromVC willMoveToParentViewController:nil];

[self transitionFromViewController:fromVC
toViewController:toVC
duration:0.4
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^
completion:^(BOOL finished) 
    NSLog(@"Completion called");
];

【讨论】:

我可以确认,当不调用完成块时,手动添加视图会有所帮助。在我的情况下,只有当新的视图控制器有一个带有 refreshControl 的集合视图时才需要。一旦我删除了 refreshControl,完成块就会被调用。很奇怪。 @Klaas 符合我的情况,尽管我从来没有想过它会是特定的极端情况。确实非常奇怪的行为。

以上是关于在 iOS 11 中,UIViewController 的 transitionFromViewController 从不调用它的完成块的主要内容,如果未能解决你的问题,请参考以下文章

iOS - UIVIewController 中的 UITableView 不显示所有行 [Swift]

如何在 Swift 4 中从 WKWebView 获取 cookie 值?

iOS Dev - 如何检测用户通过按“返回”访问此 UIViewController

ios ~ UITableView 编辑(cell的插入, 删除, 移动)

如何使用 MainStoryBoard 加载和更改 UIViewController [IOS]

iOS 自定义容器 VC 和需要特定方向的子级