从另一个类访问NSMutableArray – Objective C

我有一个主ViewController ,它包含一个设定的类。 在该ViewController有一个Container链接到embed ViewController 。 在embed ViewController我创建了一个NSMutableArray 。 我不是试图在主ViewController访问该array 。 我知道如果我使用:

 create_challenge_peopleSelect *myScript = [[create_challenge_peopleSelect alloc] init]; NSLog(@"%@",myScript.selectedCells); 

NSLog将输出null,因为我正在创建一个新的ViewController并且摆脱已经设置的array 。 所以我的问题是如何在不覆盖的情况下访问该array

更新:

inheritance人创建NSMutableArray地方:

create_challenge_peopleSelect.h

 @property (strong, nonatomic) NSMutableArray *selectedCells; 

create_challenge_peopleSelect.m

  if([selectedCells containsObject:label.text]) { cell.accessoryType = UITableViewCellAccessoryNone; [selectedCells removeObjectIdenticalTo:label.text]; } else { cell.accessoryType = UITableViewCellAccessoryCheckmark; [selectedCells addObject:label.text]; } 

此类是主ViewControllercontainer class

不,我想访问我的主ViewControllerselectedCells ,我一直在做以下事情:

 create_challenge_peopleSelect *myScript = [[create_challenge_peopleSelect alloc] init]; 

如果可能的话,我宁愿远离App Delegate

基本上,您需要维护指向原始视图的指针,而不是创建新的视图控制器。

我建议在AppDelegate中存储UIViewController的实例,以便通过使其成为全局变量来保留您创建的视图控制器的特定实例。

恩。 在App Delegate.h中

 #import "ViewController.h" @class ViewController; @interface AppDelegate : UIResponder  @property (nonatomic) ViewController *viewController; 

然后从您需要读取/写入变量的任何视图控制器的.m创建指向应用程序的app委托的指针,例如:

 #import "AppDelegate.h" @interface WhateverViewController () AppDelegate *mainDelegate; - (void)viewDidLoad { mainDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; } 

因此,无论您何时在代码中创建该视图控制器(在使用它之前),都可以使用此全局变量对其进行初始化。 恩。 如果您使用的是xib:

 mainDelegate.viewController = [[UIViewController alloc] initWithNibName:@"ViewController" bundle:nil]; [self.navigationController pushViewController:mainDelegate.viewController animated:YES]; 

恩。 如果您正在使用故事板:

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName" bundle:nil]; mainDelegate.viewController = [storyboard instantiateViewControllerWithIdentifier:@"viewControllerID"]; [self.navigationController pushViewController:mainDelegate.viewController animated:YES]; 

(这假设它位于app委托以外的地方,在这种情况下,不需要指向App Delegate的指针。)

然后从另一个UIViewController使用时访问该数组

 mainDelegate.viewController.array 

您似乎不清楚类和实例之间的区别。 好的,所以,我们有两个NSArrays:

 NSArray *a = [[NSArray alloc] initWithObjects:@"hello", @"I", @"am", @"an", @"array", nil]; NSArray *b = [[NSArray alloc] initWithObjects:@"so", @"am", @"I", nil]; 

如果我执行a.count ,我会得到5作为答案因为数组包含五个对象。 同时,如果我做b.count ,我会得到3,因为该数组包含三个对象。 这不是创造b “摆脱已经设定的count ”。 它们是彼此完全无关的独立对象。

您的视图控制器类是相同的方式。 当您创建一个不同的实例时,它不会覆盖旧实例 – 它只是不同的对象。 要使用原始视图控制器对象,您需要获取它的引用。

那么你如何得到它的参考? 嗯,一般的答案是你设计你的应用程序,以便两个对象彼此了解 。 有很多具体方法可以实现这一目标。 很多人会说“只需在应用代表中添加引用”。 这你可以做的一件事,但它并不总是最好的选择。 如果您只是在应用代理中粘贴所有内容,它就会失控。 有时它是正确的答案,通常其他事情是正确的答案。 另一种方法是让一个知道这两个对象的对象将它们相互引入。 但有时候没有这样的对象。 所以这是情境。

要从一个类访问NSMutableArray到另一个类,请使用以下代码。

在你声明了NSMutableArray对象的第一个视图控制器中,声明propertysynthesize如下所示,

//在FirstViewcontroller.h类中,

 @property (nonatomic, strong) NSMutableArray *arrData; 

//在FirstViewcontroller.m类中

 @synthesize arrData; 

FirstViewcontroller对象也应该是全局的,因此您可以在app delegate文件中创建FirstViewcontroller的对象。

//appdelegate.h

 @property (nonatomic, strong) FirstViewcontroller *objFirst; 

//appdelegate.m

 @synthesize objFirst; FirstViewcontroller *objFirst=[[FirstViewcontroller alloc]init]; 

现在在您必须访问数组的SecondViewcontroller中,创建Appdelegate文件的共享对象

//SecondViewcontroller.m

  AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 

然后使用将得到如下所需的数组,

 app.objFirst.arrData 

这是你需要的数组我希望它能帮到你。

这里的基本思想是在原始类中,数组由指针引用。 您的原始类将分配它并可能加载它。 程序的其他部分可以传递属性的内容,这是一个指针,将其分配给它们自己的指针持有者,并使用它,就像你在那里声明它一样。 请使用上面的代码;

 MyClass *aClass = [[MyClass alloc] initWithMyInitStuff]; NSMutableArray *ThatArray = aClass.MyArray; NSLog("Count of ThatArray: %d", [That.Array count]); 

您在提供的代码中所做的是为可变数组设置公共属性…

 @property (strong, nonatomic) NSMutableArray *selectedCells; 

通过设置该属性不会“创建” NSMutableArray 。 在代码中的某些时候,您还必须通过初始化来创建NSMutableArray

 NSMutableArray *selectedCells = [[NSMutableArray alloc] init]; 

或使用方便的方法,如…

 NSMutableArray *selectedCells = [NSMutableArray arrayWithCapacity:(NSUInteger)]; 

要么

 NSMutableArray *selectedCells = [NSMutableArray arrayWithArray:(NSArray *)]; 

初始化NSMutableArray通常只执行一次。 如果重复,则会覆盖用于指向数组的属性的内容。 因此,有用的位置通常在viewDidLoad视图控制器生命周期方法中。