从另一个类访问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]; }
此类是主ViewController
的container class
不,我想访问我的主ViewController
的selectedCells
,我一直在做以下事情:
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
对象的第一个视图控制器中,声明property
并synthesize
如下所示,
//在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
视图控制器生命周期方法中。