2010-03-02 60 views
20

传递一些Viewcontrollers之间的数据我有以下问题:iPhone:如何在一个应用程序的TabBar

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

我已经做了一些研究。对应于干净的模型方法,最好的方法是在被调用的viewcontroller上调用一些initWithObject:方法。 我该如何做到这一点?如何在调用者控制器内调用接收器控制器的init方法?你能给我一些代码示例吗?

编辑: 要在多个视图/类之间传递数据等,只需创建一些数据类来保存在几个类之间共享的数据。欲了解更多信息,请点击以下链接: Singleton

回答

28

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

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

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

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

的快速和肮脏的方式来创建一个数据模型是将属性添加到应用程序的委托,然后使用调用从视图控制器应用程序的委托:

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

这对小项目,但作为工作你的数据变得越来越复杂,你应该为你的数据模型创建一个专用的类。

编辑:

澄清您的特定情况下,你会当接收机的viewController成为活动的呼叫添加到数据模型。

将数据放在init方法或viewDidLoad中将不起作用,因为在UITabBar中,用户可以来回切换而不卸载视图或重新初始化视图控制器。

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

+1

非常感谢。我现在使用单例方法。我还发布了一些很好的教程链接,其中描述了创建单例数据模型必须完成的步骤。 – 2010-03-04 02:21:20

4

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

+0

这是真的,但我认为你不能通过NSNotificationCenter传递对象。所以我可以发送一些通知给receiverController。但是,我仍然有问题,我需要我的初始参数来启动新的viewcontroller。 – 2010-03-02 15:00:23

+4

你会错的。你完全可以通过'NSNotificationCenter'传递对象。例如,您可以使用; ' - (void)postNotificationName:(NSString *)notificationName对象:(id)notificationSender userInfo:(NSDictionary *)userInfo',或者只是'+(id)notificationWithName:(NSString *)aName对象:(id)anObject' – 2010-03-02 15:26:36

0

我不认为这是最好的做法(也进行语法检查),但是我已经逃脱了:

在.H

otherclassref *otherclassname 

@property (assign) otherclassname otherclassref; 

,并在.M

@synthesize otherclassref; 

然后我只是从方便的地方分配参考应用程序委托或任何你实例化你的viewcontrollers。

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

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

+0

This会起作用,但这不是一种好的做法,因为视图控制器之间的引用复杂性会随着视图添加而变得更加复杂。添加或删除一个视图控制器意味着更新其他几个。一个视图控制器可以破坏另一个视图中的数据。 – TechZen 2010-03-02 16:02:08

+0

@TechZen对我来说听起来很合理 – PeanutPower 2010-03-02 18:14:26

相关问题