iPhone:如何在选项卡应用程序中的多个视图控制器之间传递数据

20

我有以下问题:

我已经建立了一个有4个选项卡的应用程序。我想从第一个选项卡控制器中传递一个对象/变量到第三个,并使用相应的对象初始化该控制器。

我已经做了一些研究。根据干净的模型方法,最好的方式是在被调用的视图控制器上调用一些initWithObject:方法。 我该如何实现这一点?如何在调用者控制器中调用接收控制器的init方法?你能给我一些代码示例吗?

编辑: 要在多个视图/类之间传递数据,只需创建一些数据类来保存在多个类之间共享的数据。有关更多信息,请访问以下链接: Singleton

3个回答

28

您需要一个数据模型对象来存储应用程序的数据。

数据模型是一个定制的、独立的对象,可以从应用程序的任何位置访问。数据模型对象不知道任何视图或视图控制器。它只存储数据和这些数据之间的逻辑关系。

当应用程序的不同部分需要写入或读取数据时,它们会将数据写入和读取到数据模型中。在您的情况下,视图1在卸载时将其数据保存到数据模型中,然后视图2在加载时从数据模型中读取该数据(或反之亦然)。

在设计良好的应用程序中,没有两个视图控制器应该能够访问另一个控制器的内部数据。(视图控制器需要了解另一个控制器的存在,唯一的原因是它必须触发该其他控制器的加载。)

创建数据模型的快速而简单的方法是将属性添加到应用程序委托中,然后使用以下方法从视图控制器调用应用程序委托:

YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate];
myLocalProperty = appDelegate.someDataModelProperty;
这对于小项目来说是可行的,但随着数据变得更加复杂,你应该为你的数据模型创建一个专用类。
编辑:
为了澄清你的特定情况,在接收视图控制器变为活动状态时,您将添加对数据模型的调用。
在init方法或viewDidLoad中放置数据不起作用,因为在UITabBar中,用户可以在不卸载视图或重新初始化视图控制器的情况下来回切换。
检索正在更改的数据的最佳位置是在viewWillAppear控制器方法中。这样,每次用户切换到该选项卡时,数据都会更新。

1
非常感谢。我现在使用单例模式。我还发布了一些链接到一个很好的教程,描述了创建单例数据模型需要执行哪些步骤。 - Simon D.

4

您可能需要考虑使用 NSNotificationCenter (参考文献);您可以将一个视图控制器注册到应用程序通知中心,并在选择时发送通知。当接收到通知时,另一个视图控制器会相应地更新自己。


没错,但我认为你不能通过NSNotificationCenter传递对象。因此,我可以向接收器控制器发送一些通知。但是我仍然需要我的初始化参数来初始化新的视图控制器,所以这仍然是个问题。 - Simon D.
4
你的想法是错误的。你可以完全通过NSNotificationCenter传递对象。例如,你可以使用- (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender userInfo:(NSDictionary *)userInfo或者+ (id)notificationWithName:(NSString *)aName object:(id)anObject - Williham Totland

0

我认为这不是最佳实践(还要检查语法),但我已经成功地使用了:

在 .h 文件中

otherclassref *otherclassname

@property (assign) otherclassname otherclassref;

并且在 .m 文件中

@synthesize otherclassref;

然后我只需要从某个方便的地方(例如应用代理或您正在实例化视图控制器的任何位置)分配引用。

然后,视图控制器可以获得对其他视图控制器的引用。

我在第一个视图控制器的.h文件中添加@class secondviewcontroller,并将#imports“secondviewcontroller.h”放入第一个视图控制器的.m文件中。这些被称为前向引用,并防止由.h文件相互引用导致的编译器错误。


这样做是可行的,但并不是一个好的实践,因为随着你添加视图,视图控制器之间的引用复杂性会越来越大。添加或删除一个视图控制器意味着要更新其他几个视图控制器。一个视图控制器可能会破坏另一个视图控制器中保存的数据。 - TechZen
@TechZen 嗯,听起来对我来说是合理的。 - acheo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接