如何将 NSMutableArray 传递给另一个 ViewController 类

Posted

技术标签:

【中文标题】如何将 NSMutableArray 传递给另一个 ViewController 类【英文标题】:How to passing a NSMutableArray to another ViewController class 【发布时间】:2011-06-29 14:16:26 【问题描述】:

我在 "HeroListViewController" 中创建了 NSMutale 数组。我想在另一个 viewController 中使用它,即 MapTutorialViewController。我试过这样。

在 HeroListViewController.h 中

MapTutorialViewController *maptutorialcontroller;
NSMutableArray *listData; 

设置属性并正确合成

在 HeroListViewController.m 中

- (void)viewDidLoad 
    [super viewDidLoad];

    listData = [[NSMutableArray alloc] init];   
    

 - (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

static NSString *HeroTableViewCell = @"HeroTableViewCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HeroTableViewCell];
if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:HeroTableViewCell] autorelease];

NSManagedObject *oneHero = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSInteger tab = [tabBar.items indexOfObject:tabBar.selectedItem];
switch (tab) 
    case kByName:
        cell.textLabel.text = [oneHero valueForKey:@"name"];
        cell.detailTextLabel.text = [oneHero valueForKey:@"secretIdentity"];
        break;
    case kBySecretIdentity:
        cell.detailTextLabel.text = [oneHero valueForKey:@"name"];
        cell.textLabel.text = [oneHero valueForKey:@"secretIdentity"];
    default:
        break;


        [listData addObject: [oneHero valueForKey:@"secretIdentity"]];


        count=[listData count];
                printf("No of items of listData:%u\n", count);


if(maptutorialcontroller==nil)
      maptutorialcontroller= [[MapTutorialViewController    alloc]initWithNibName:@"MapTutorialViewController" bundle:nil];
maptutorialcontroller.secondarray=listData;

count=[maptutorialcontroller.secondarray count];
printf("No of items of seconarray :%u\n", count);

return cell;

输出: listData 的项目数:3 seconarray 的项目数:3 // 两者都是正确的

但是我遇到的问题是,当我尝试像这样在“MapTutorialViewController”中使用第二个数组时, 在 MapTutorialViewController.h 中

    HeroListViewController *heroviewcontroller;
  NSMutableArray *secondarray; 

设置属性并正确合成

在 MapTutorialViewController.m 中

 - (void)viewDidLoad 
   
    heroviewcontroller = [[HeroListViewController alloc]initWithNibName:@"HeroListViewController"  bundle:nil]; 
   self.secondarray=[heroviewcontroller.listData mutableCopy];
   //secondarray= heroviewcontroller.listData;
int count;
count = [secondarray count];
//  
   printf("No of items of secondarray from MapTutorialViewContriller :%u\n", count);
   

输出:来自 MapTutorialViewContriller 的 secondarray 的项目数:0为什么是 0

我的代码有什么问题,请帮助我

【问题讨论】:

它不能像以前那样完成,因为当你分配初始化一个视图控制器时,只有当你在 HeroListViewController 的 init 函数中初始化它们时,它的所有字段都是空的 【参考方案1】:

示例

firstviewcontroller .h file

        before @interface 

        use @class secondViewcontroller;


declare this inside of @interface  with

        secondViewcontroller *sVC;


then in firstViewController.m file 

        before @implementation          

    #import "secondViewcontroller.h"

then
-------------------

secondVC.h file

        @interface inside declare this

        say NSMutableArray *secondarray;

        and sythasize them.

------------------- 

after this 

        in firstViewcontroller.h viewdidload create this sVC by alloc and initwithnibname then

        sVC.secondArray=urfirstArray;

        now while u push this sVC controller to navigation controller u can nslog this array in viewdidload.

【讨论】:

我做到了,但它给出了两个警告和应用程序崩溃 ** 属性 'secondarray' 需要定义方法 '-secondarray' - 使用 @synthesize、@dynamic 或提供方法实施** 和** 属性 'secondarray' 需要定义方法 'setSecondarray:' - 使用 @synthesize、@dynamic 或提供方法实现** 在 secondviewcontroller 的 .h 文件中 @property ( nonatomic , retain ) NSMutableArray *secondArray; @end 然后在secondviewcontroller的.m文件中@synthesize secondArray; 是的,我已经这样做了,但是当我在secondVC的viewDidLoad方法中计算secondarray时,返回0【参考方案2】:

这仅在您在 init 方法中创建并填充可变数组时才有效。

您应该查看委托和/或通知。

【讨论】:

@dasdom,你能给我一些代码帮助吗?因为我对 iPhone 开发很陌生。高度赞赏。 . .【参考方案3】:

这个数组是如何在 HeroListViewController 中创建的?在这个方法中,你正在创建一个新的 HeroListViewController 实例并试图从中获取一个属性。如果你的内存中已经有一个 HeroListViewController,那就大错特错了。

为此 viewDidLoad 方法在类上创建一个属性。它应该是 NSMutableArray 类型。当你分配和初始化这个类时,从 HeroListViewController 调用 [set myArray:heroListArray] 。这应该可以让您访问它。

【讨论】:

我像这样创建了 NSMutableArray,并设置了属性。 NSMutableArray *listData; @property (nonatomic,retain) NSMutableArray *listData; 你能给我一些代码帮助吗?因为我对 iPhone 开发很陌生。高度赞赏。 . .【参考方案4】:

我假设你有一个包含这个新视图和英雄列表视图的视图。如果是这种情况,那么您可以像这样在新视图中创建一个属性:

@property (nonatomic,retain)HeroListViewController *heroListViewController;

然后从外面设置它等于 heroList:

newView.heroListViewController = HeroListViewController;

目前您的代码的主要问题是您正在使用 alloc init 创建一个新的 HeroListViewController 实例,而您访问的不是同一个东西。通过设置新视图的 heroListViewController 属性,您可以访问正确的视图控制器。

最后,在新视图的 viewDidLoad 中——我实际上将代码放在 viewWillAppear:(BOOL)Animated 中——你可以放置代码来匹配数组。

请注意,这样做的整个方式很混乱,如果您需要在多个位置访问数组,最好使用单例类来完成。以上将帮助您快速工作,但如果您想要一个真正干净的修复,请转到此处:http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/24135-singleton-classes.html

【讨论】:

以上是关于如何将 NSMutableArray 传递给另一个 ViewController 类的主要内容,如果未能解决你的问题,请参考以下文章

将按下的按钮传递给另一个 View JSON

将 NSMutableArray 分配给另一个时的奇怪行为(iOS 6)

Objective-C:如何将对象树传递给远程分布式对象?

如何将数组传递给另一个活动?

如何将关键部分传递给另一个线程?

如何将变量从一个类传递给另一个?