unwind segue - 检测动画何时完成
unwind segue - detect when animation completes
我喜欢使用 unwind segues 但遇到了问题...
我有一个 parent 控制器(称之为 Home),它以模态方式呈现 child(称之为 Detail).
Detail 控制器有一个 table 显示核心数据实体集合的视图,我有一个删除按钮,点击它时我想删除所有这些实体,关闭模式,然后更新主控制器以显示实体已被删除。
我的第一次尝试 self.context.deleteObject(entity)
之后是一个展开的 segue 成功了,除非有足够多的实体使得 table 视图可以随动量滚动,并且在点击删除按钮的同时table 仍在减速。这会导致崩溃:(
据我所知,这是因为我刚刚删除了实体,但是因为 table 视图仍在滚动(在关闭动画完成时),table 视图试图出列即将出现的单元格(由于滚动)但随后崩溃,因为不再有实体。
如果在关闭模型视图时调用了 viewDidAppear,我可以在那里更新主页(但未调用它)。
如果 unwind segue 有一个在动画完成时调用的闭包,我可以在那里更新主页(但据我所知还没有)。
所以现在我手动调用 dismissViewControllerAnimated
并使用那里的闭包来刷新 Home 控制器...
if let nc = self.presentingViewController as? UINavigationController, home = nc.topViewController as? HomeViewController {
self.dismissViewControllerAnimated(true, completion: { _ in
self.model.deleteEntities()
home.refresh()
})
}
这行得通,但感觉不对(我猜是因为我觉得细节控制器必须了解主控制器是 'bad')。关于更好的方法有什么建议吗?
在呈现视图控制器的 viewWillDisappear:
中,或在呈现视图控制器的 viewWillAppear:
中,抓取 self.transitionCoordinator
并调用 notifyWhenInteractionEndsUsingBlock:
- 该块将在当动画结束时,dismissViewController
的完成块将是。
我喜欢使用 unwind segues 但遇到了问题...
我有一个 parent 控制器(称之为 Home),它以模态方式呈现 child(称之为 Detail).
Detail 控制器有一个 table 显示核心数据实体集合的视图,我有一个删除按钮,点击它时我想删除所有这些实体,关闭模式,然后更新主控制器以显示实体已被删除。
我的第一次尝试 self.context.deleteObject(entity)
之后是一个展开的 segue 成功了,除非有足够多的实体使得 table 视图可以随动量滚动,并且在点击删除按钮的同时table 仍在减速。这会导致崩溃:(
据我所知,这是因为我刚刚删除了实体,但是因为 table 视图仍在滚动(在关闭动画完成时),table 视图试图出列即将出现的单元格(由于滚动)但随后崩溃,因为不再有实体。
如果在关闭模型视图时调用了 viewDidAppear,我可以在那里更新主页(但未调用它)。
如果 unwind segue 有一个在动画完成时调用的闭包,我可以在那里更新主页(但据我所知还没有)。
所以现在我手动调用 dismissViewControllerAnimated
并使用那里的闭包来刷新 Home 控制器...
if let nc = self.presentingViewController as? UINavigationController, home = nc.topViewController as? HomeViewController {
self.dismissViewControllerAnimated(true, completion: { _ in
self.model.deleteEntities()
home.refresh()
})
}
这行得通,但感觉不对(我猜是因为我觉得细节控制器必须了解主控制器是 'bad')。关于更好的方法有什么建议吗?
在呈现视图控制器的 viewWillDisappear:
中,或在呈现视图控制器的 viewWillAppear:
中,抓取 self.transitionCoordinator
并调用 notifyWhenInteractionEndsUsingBlock:
- 该块将在当动画结束时,dismissViewController
的完成块将是。