2011-07-05 108 views
2

我想要一些帮助,因为我想找到一个好的方法来发布一个NSMutableArray到另一个类。发送NSMutableArray到一个UIViewController

所以我有一个NSMutableArray一个UIViewController

例如(如果用户选择从RootViewController的一个细胞,其是推动)

代码在RootViewController的当用户选择一个小区:

QueryTableViewController *queryTableView 
     = [[QueryTableViewController alloc] initWithQuery:query]; 
[self.navigationController pushViewController:queryTableView animated:YES]; 
[queryTableView release]; 

代码在QueryTableViewController

@interface QueryTableViewController : UIViewController{ 
NSMutableArray *results; 
} 

@implementation QueryTableViewController // more code 
-(int)fetchQueryWithString:(NSString*)string{ 
    // Searching twitter. 
    // add objects in the results array. 
    // **HERE** Once I gather all the objects I am posting a notification: 
} 

在另一侧我有DetailViewController里面是空的,并且需要在阵列创建另一个的UIViewController和添加子视图。 例如

// when the notification is received 
self.statsTableView = [[StatsTableVC alloc] initWithTweets:**HERE**]; 
[self addSubView:self.statsTableView]; 

目前我在fetchQueryWithString方法结束旨意通知共享阵列。我想知道是否有更好的方法将它发送到另一个UIViewController?

(我敢肯定有;)

在此先感谢。

回答

0

有两种方法对多个视图控制器之间的数据处理。

首先,存在依赖注入,它只是简单地将引用传递给控制器​​之间的数据存储对象。由于对象是通过引用传递的,因此可以在一个控制器中修改数据对象,使数据出现在另一个控制器中。

就你而言,你的数据对象只是一个可变数组。您将定义一个属性来保存将使用它的每个视图控制器中的数组。因此,在您的RootViewController中,您将定义一个NSMutableArray属性,创建一个空数组,然后在加载时将其传递给下一个视图控制器。

QueryTableViewController *queryTableView 
     = [[QueryTableViewController alloc] initWithQuery:query]; 
queryTableView.results=self.queryResults; 
[self.navigationController pushViewController:queryTableView animated:YES]; 
[queryTableView release]; 

由于RootViewController实例和QueryTableViewController实例共享对相同可变数组的引用,每个作为访问由其他的修改。

依赖注入具有前端简单的优点。但是,它具有将所有视图控制器对数据的访问绑定到一个严格的层次结构中的缺点。如果您在视图层次结构中移动视图控制器,添加或删除视图控制器或将视图控制器移动到另一个应用程序,则可能必须重写所有视图的数据处理。

第二种方法使用伪单体使数据对象可在应用程序的任何位置访问。该应用程序是一个单身人士,因此,使应用程序有效地委派一个单身人士。

随时随地获取应用程序委托的应用程序:

AppDelegateClassName *appDelegate=(AppDelegateClassName *)[[NSApplication sharedApplication] delegate]; 

......那么,是指应用程序委托的任何财产:

NSMutableArray *localResults=appDelegate.results; 

该系统的优势在于,它使视图控制器彼此独立。您可以轻松移动它们,甚至将它们移动到其他应用程序。

+0

感谢您的信息。将detailViewController设置为单例并设置数组会是不好的选择吗? – PatrickG4

+0

是的,没有理由让任何控制器成为单身人士。控制器始终根据其特定的视图和数据模型进行定制。因此,使一个人成为一个单身人士是毫无意义的。控制器在Apple API采用的Model-View-Controller设计中不包含任何重要数据。他们应该简单地引用一个数据模型对象,该对象可以是简单数组,自定义对象或(最重要的)核心数据堆栈中的任何数据模型对象。 – TechZen

+0

我创建了一个Repository对象作为单例以在单独的控制器上使用该数组。再次感谢。 – PatrickG4

0

如果它的可在您的应用程序的多个类中共享,则可以使您的array可通过singleton class获得。

因此,你的单身人士课程将举行NSMutableArray实例,并通过一些getter函数使其他人可用。

0

以下步骤使用在另一个类A中创建的类B上的数组。

在A类的实现文件,上面@implementation,声明一个数组,像这样:

NSArray *array; 
@implementation 

...在你的方法,你充满了你的NSMutableArray的可变数组分配给该阵列,如:

现在
array = arrMutable; 

,在B类以上@implementation的extern它像

extern NSArray *array; 
@implementation 

现在你有你的alll数组,在nsmutable阵列

希望它可以帮助...........中的元素

0

请导入appdelegate .h文件,在哪个类中使用nsmutuable数组。 然后在appdelegate类的nsmutable数组中定义属性。

然后你想要使用哪个类数组。

[yourappdelegateclass sharedinstance].appdelegatearray = yourarray; 
相关问题