2

我正在实现一个自定义 URL 方案,它将向我的数据模型添加实体。实体的详细信息包含在 URL 中。基本思想是电子邮件链接(或来自另一个应用程序的链接)将打开我的应用程序并添加新实体。

问题是,我永远无法确定我的应用在响应时会处于哪种状态。任何数量的视图控制器都可能在视图中。如果实体列表在视图中,我需要为该实体插入一个新行。如果屏幕上有其他视图,我需要做出不同的反应。一些视图也可能是模态的。

当这种情况发生时,我会对一个简单的模式感到满意——中止用户当前正在做的任何事情,然后弹出到根视图控制器。从这里我可能会推送到一个控制器,在那里我将显示正在添加的新实体。

我尝试总是关闭任何显示的模式并弹出到根目录,这样做的好处是不需要知道到底显示了什么:

[(UINavigationController *)self.window.rootViewController dismissViewControllerAnimated:NO completion:nil];
[(UINavigationController *)self.window.rootViewController popToRootViewControllerAnimated:NO];

这工作得相当好,但至少有两种情况是不够的:

  1. 如果在显示模式时创建了某个对象(然后使用模式来修改新对象),并且如果用户取消,则委托负责删除该对象,则实体将保持活动状态。
  2. 如果UIActionSheet显示 a,则所有赌注都关闭。如果不知道显示它的控制器,可以访问该控制器并向其发送消息以关闭操作表,我就无法关闭它。如果不这样做,将弹出根视图控制器,但操作表仍保留在屏幕上。操作表上的后续点击当然会导致崩溃,因为显示它的控制器已经消失。

我该如何稳健地处理这个问题?我是否应该尝试具体找出当前呈现的视图控制器,并依次处理每个场景?或者是否有一个更具可扩展性的解决方案,每次我添加控制器或更改应用程序的流程时都不需要更新?

4

1 回答 1

3

听起来您正在尝试做几件事:

  1. 当用户点击您的自定义 url 时,您希望将“实体”添加到您的模型中。
  2. 你想以某种形式显示这个新实体EntityListViewController,它可能在也可能不在 ViewController 堆栈上。
  3. 您(可能)想要弹出EntityListViewController.
  4. 您希望用户知道添加了一个新实体(可能只是通过执行第 2 项)。
  5. 您想要推送某种EntityViewController,或者如果EntityViewController视图控制器堆栈中当前有 ,您想要重新加载新实体的数据。

听起来您已经准备好第 1 项,因为您没有明确询问有关处理 url 点击和插入新模型对象的问题。

剩下的,一个灵活的 MVC 模式将是使用 NSNotificationCenter。

插入新模型对象的代码将“发布”通知:

[[NSNotifcationCenter defaultCenter] postNotificationName:@"entity_added" object:myNewEntity];

然后,您的各种 UI 元素(例如,UIAlertView 和 UIViewController 子类)将侦听此通知并采取一些有用的操作(例如关闭它们自己,或者在 or 的情况下EntityListViewControllerEntityViewController重新加载它们自己)。

例如,UIViewController子类可能会这样做:

-(void) viewDidLoad
{
  [super viewDidLoad];
  [[NSNoticationCenter defaultCenter] addObserver:self selector:@selector(onNewEntity:) name:@"entity_added" object:nil];


-(void) onNewEntity:(MyEntity*)entity
{
   // close, or redraw or...
}

-(void) dealloc
{
  [[NSNoticationCenter defaultCenter] removeObserver:self];
  // if not using ARC, also call [super dealloc];
}

为了让你的生活保持简单(并且不要太担心所有不同的 UI 状态),我会考虑在通知发生时这样做:

  1. 重绘本身(如果上面有EntityListViewController东西也没关系)。
  2. 在导航栏中(或您​​知道始终可见的其他地方)显示某种短暂的指示器,或播放声音以便用户知道添加了实体。
  3. 就这样。

如果您采用这种方法,那么对用户正在/正在做的事情的影响最小,但是当他们确实导航回时,EntityListViewController它已经显示了所有新实体。

显然,如果单击自定义 URL 可能会删除现有实体,那么弹出与该实体相关的任何视图控制器会更重要。但这也是你可以使用相同的模式来做的事情——让模型或控制器发布通知,然后让各种 UI 元素监听它并采取适当的行动。

于 2013-01-02T02:03:33.383 回答