【问题标题】:unwind segue - detect when animation completesunwind segue - 检测动画何时完成
【发布时间】:2015-09-03 02:07:15
【问题描述】:

我喜欢使用 unwind segues,但遇到了问题......

我有一个父控制器(称为 Home),它以模态方式呈现一个子控制器(称为 Detail)。

Detail 控制器有一个 tableview 显示核心数据实体的集合,我有一个 Delete 按钮,当它被点击时,我想删除所有这些实体,并关闭模式,并更新 home 控制器以显示实体已被删除。

我第一次尝试self.context.deleteObject(entity),然后是展开转场,但在有足够多的实体可以让表格视图随动量滚动并且在表格仍在减速时点击删除按钮的情况除外。这会导致崩溃:(

据我所知,这是因为我刚刚删除了实体,但是因为 tableview 仍在滚动(在关闭动画完成时)tableView 试图使即将出现的单元格出列(因为滚动)但随后由于不再有实体而崩溃。

  • 如果 viewDidAppear 在模型视图被关闭时被调用,我可以在那里更新 Home(但它没有被调用)。

  • 如果 unwind segue 有一个在动画完成时被调用的闭包,我可以在那里更新 Home(但我找不到它)。

所以现在我手动调用dismissViewControllerAnimated 并使用那里的闭包来刷新 Home 控制器...

if let nc = self.presentingViewController as? UINavigationController, home = nc.topViewController as? HomeViewController {

    self.dismissViewControllerAnimated(true, completion: { _ in
        self.model.deleteEntities()
        home.refresh()

    })
}

这可行,但感觉不对(我猜是因为我觉得 Detail 控制器必须了解 Home 控制器是“不好的”)。关于更好的方法有什么建议吗?

【问题讨论】:

    标签: ios core-data tableview modalviewcontroller unwind-segue


    【解决方案1】:

    在呈现视图控制器的viewWillDisappear: 或呈现视图控制器的viewWillAppear: 中,抓取self.transitionCoordinator 并调用notifyWhenInteractionEndsUsingBlock: - 当来自dismissViewController 的完成块将被调用时,该块将被调用,当动画结束了。

    【讨论】:

    • "如果 viewDidAppear 在模态视图被关闭时被调用" 它调用,所以我不太明白那个条件......
    • 谢谢! notifyWhenInteractionEndsUsingBlock: 正是我想要的!我将其设置为准备 segue 并使用 unwind。我也很惊讶 viewWillAppear: 没有被调用,但我认为这是因为我使用了一个不占用全屏的自定义演示控制器。
    • “但我认为这是因为我使用了一个不占用全屏的自定义演示控制器”这正是原因 - 感谢您添加该详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多