如何将 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 类的主要内容,如果未能解决你的问题,请参考以下文章