将NSMutableArray发送到UIViewController

时间:2011-07-05 03:25:40

标签: iphone uiviewcontroller nsmutablearray nsarray

我想要一些帮助,因为我正在努力寻找一种将NSMutableArray发布到另一个类的好方法。

所以我有一个带有NSMutableArray的UIViewController(如果用户从RootViewController中选择一个单元,则会被推送)

e.g。

当用户选择一个单元格时,

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并添加子视图。 e.g。

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

目前我在fetchQueryWithString方法的末尾发布通知以共享数组。我想知道是否有更好的方法将它发送到另一个UIViewController?

(我确信有;)

先谢谢。

4 个答案:

答案 0 :(得分:0)

如果应用程序中的多个类可以共享,那么您可以通过singleton class 使array可用。

因此,您的单例类将保留NSMutableArray个实例,并通过某些getter函数将其提供给其他人。

答案 1 :(得分:0)

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

在A类的实现文件中,在@implementation之上,声明一个如下数组:

NSArray *array;
@implementation

...在您填充NSMutableArray的方法中,将可变数组分配给此数组,如:

array = arrMutable;

现在,在@implementation extern上面的B类中,它就像

extern NSArray *array;
@implementation

现在你已经在数组中使用了nsmutable array

中的元素

希望它有帮助...........

答案 2 :(得分: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]; 

...然后,引用app delegate的任何属性:

NSMutableArray *localResults=appDelegate.results;

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

答案 3 :(得分:0)

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

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

    [yourappdelegateclass sharedinstance].appdelegatearray = yourarray;