【发布时间】:2012-12-31 00:03:23
【问题描述】:
我正在实现一个自定义 URL 方案,它将向我的数据模型添加实体。实体的详细信息包含在 URL 中。基本思想是电子邮件链接(或来自另一个应用程序的链接)将打开我的应用程序并添加新实体。
问题是,我永远无法确定我的应用在响应时会处于哪种状态。任何数量的视图控制器都可能在视图中。如果实体列表在视图中,我需要为该实体插入一个新行。如果屏幕上有其他视图,我需要做出不同的反应。有些视图也可能是模态的。
当这种情况发生时,我会对一个简单的模式感到满意 - 中止用户当前正在执行的任何操作,并弹出到根视图控制器。从这里我可能会推送到一个控制器,在那里我将显示正在添加的新实体。
我尝试总是关闭任何显示的模式并弹出到根目录,这样做的好处是不需要知道究竟显示了什么:
[(UINavigationController *)self.window.rootViewController dismissViewControllerAnimated:NO completion:nil];
[(UINavigationController *)self.window.rootViewController popToRootViewControllerAnimated:NO];
这工作相当不错,但至少有两种情况是不够的:
- 如果在呈现模式时创建了某个对象(然后使用模式来修改新对象),并且如果用户取消,则委托有责任删除该对象,该实体将保持活动状态。
- 如果正在显示
UIActionSheet,则所有投注均已关闭。如果不知道显示它的控制器,可以访问该控制器并向其发送消息以关闭操作表,我就无法关闭它。如果不这样做,根视图控制器会弹出,但操作表会留在屏幕上。后续点击操作表当然会导致崩溃,因为显示它的控制器已经消失。
我该如何稳健地处理这个问题?我是否应该尝试具体找出当前呈现的视图控制器,并依次处理每个场景?或者是否有一个更具可扩展性的解决方案,每次我添加控制器或更改应用程序的流程时都不需要更新?
【问题讨论】:
标签: ios cocoa-touch uiviewcontroller url-scheme appdelegate