0

我喜欢使用 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 控制器是“不好的”)。关于什么是更好的方法的任何建议?

4

1 回答 1

0

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

于 2015-09-03T02:15:41.870 回答