iPhone:如何在Tabbar应用程序中的几个View控制器之间传递数据

时间:2010-03-02 14:30:09

标签: iphone objective-c uiviewcontroller uitabbarcontroller

我有以下问题:

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

我已经做过一些研究。对应于干净模型方法的最佳方法是在被调用的viewcontroller上调用一些initWithObject:方法。 我怎样才能做到这一点?如何在调用者控制器中调用receiverController的init方法?你能给我一些代码示例吗?

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

3 个答案:

答案 0 :(得分:28)

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

数据模型是可从应用程序中的任何位置访问的自定义独立对象。数据模型对象对任何视图或视图控制器一无所知。它只存储数据和该数据之间的逻辑关系。

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

在设计合理的应用中,没有两个视图控制器可以访问另一个控制器的内部数据。 (视图控制器需要知道另一个控制器是否存在的唯一原因是它是否必须触发另一个控制器的加载。)

创建数据模型的快捷方法是向app delegate添加属性,然后使用以下命令从视图控制器调用app delegate:

YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate];
myLocalProperty = appDelegate.someDataModelProperty;

这适用于小型项目,但随着数据变得复杂,您应该为数据模型创建专用类。

编辑:

为了澄清您的具体情况,您将在接收器viewController变为活动状态时添加对数据模型的调用。

将数据放在init方法或viewDidLoad中是行不通的,因为在UITabBar中,用户可以在不卸载视图或重新初始化视图控制器的情况下来回切换。

检索更改数据的最佳位置是viewWillAppear控制器方法。这样,每次用户切换到该选项卡时,数据都会更新。

答案 1 :(得分:4)

您可能需要考虑NSNotificationCenterReference);您将一个viewcontroller注册到应用程序通知中心,并在进行选择时发送通知。收到通知后,另一个viewcontroller会相应地更新自己。

答案 2 :(得分:0)

我不认为这是最佳做法(也检查语法),但我已经离开了:

中的.h

otherclassref *otherclassname

@property (assign) otherclassname otherclassref;

和.m

@synthesize otherclassref;

然后我只是从方便的地方分配参考,例如应用程序委托或您实例化视图控制器的任何地方。

然后视图控制器可以获得对另一个视图控制器的引用。

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