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