【问题标题】:Where is the proper place to reload TableView data?重新加载 TableView 数据的合适位置在哪里?
【发布时间】:2012-01-20 18:25:11
【问题描述】:

我的项目有几个视图控制器,比如说 A 和 B。 在 A 我有一个 UITableView。选择行时,我通过行号和小区文本查看B,然后查看pushViewController b。

在视图 B 中,当点击“完成”按钮时,我对基础数据(现在是单例数组)进行了更改,然后弹回视图 A。在视图 A viewDidAppear 中,我重新加载 UITableView 以查看新数据.

这是最好的方法吗? 或者我应该在点击“完成”按钮时重新加载 UITableView? 如果是这样,我如何从视图 B 中重新加载视图 A 中的表?

谢谢。

【问题讨论】:

  • reloadData 从用户体验的角度来看真的很糟糕。使用 insertRowsAtIndexPaths:withRowAnimation:、deleteRowsAtIndexPaths:withRowAnimation: 等,避免滚动位置和选择问题。

标签: iphone objective-c xcode


【解决方案1】:

最好在点击“完成”按钮时直接重新加载数据。您可以通过通知中心来做到这一点。请查看此link 了解有关通知中心的更多详细信息。

【讨论】:

  • 完美运行!后续行动:“删除通知”应该在哪里?我假设在主视图的 viewDidUnload 中?
  • 理论上删除应该是你不再需要听的时候。因此,这取决于您的需求,但通常因为只要应用程序正在运行,您就需要收听,那么删除应该在应用程序(或该特定视图)退出时进行。一种选择可能是viewDidUnload,另一种可能是dealloc。这取决于您希望删除的确切时间。
【解决方案2】:

ViewController "A" 当然应该负责决定重新加载表数据。我会考虑将其放入 ViewController A 的“viewWillAppear”方法中。这样表在显示之前会重新加载以防止和“闪烁”。

【讨论】:

    【解决方案3】:

    这并没有什么太大的问题,只是每次调用viewDidAppear 时都会重新加载您的表,这可能不是很好,具体取决于表的大小。最好的方法是使用@protocol 并制作一个快速的委托设计模式,尽管如果您不习惯这似乎是不必要的头痛。你也可以使用NSNotifications,虽然在这种情况下我不会坚持使用它,因为没有多少观察者在听这个事件。

    【讨论】:

      【解决方案4】:

      而不是使用 NSNotification。您可以将视图 A 指定为视图 B 的委托,这是一种更简洁的设计模式。

      所以在视图 A 中它看起来像

      ViewB *b = [[ViewB alloc] init];
      b.delegate = self;
      

      当你完成修改后,在 viewB 中调用

      [delegate updateTable];
      

      其中 updateTable 是委托声明中的 @required 方法,因为如果它说它符合该委托,它所需的 viewA 将需要实现它。

      这个方法也会在你弹出 viewB 之前被调用。

      【讨论】:

      • 我没有尝试过,但它似乎也是一个非常简单的解决方案 - 谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多