我有一个包含指定类的主ViewController
。在ViewController
内,有Container
与embed ViewController
相关联。在embed ViewController
内,我正在创建NSMutableArray
。我没有尝试访问主array
中的ViewController
。我知道如果我使用:
create_challenge_peopleSelect *myScript = [[create_challenge_peopleSelect alloc] init];
NSLog(@"%@",myScript.selectedCells);
NSLog
将输出null,因为我正在创建一个新的ViewController
并且摆脱已经设置的array
。所以我的问题是如何在不覆盖它的情况下访问array
?
更新:
正在创建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];
}
此课程是主container class
ViewController
不,我想访问我的主selectedCells
中的ViewController
,我一直在做以下事情:
create_challenge_peopleSelect *myScript = [[create_challenge_peopleSelect alloc] init];
如果可能的话,我宁愿远离App Delegate
。
答案 0 :(得分:2)
您似乎不清楚类和实例之间的区别。好的,所以,我们有两个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
"。它们是完全不相关的独立物体。
您的视图控制器类是相同的方式。当您创建不同的实例时,它不会覆盖旧的实例 - 它不是同一个对象。要使用原始视图控制器对象,您需要获得对它的引用。
那你怎么得到它的参考?好吧,一般的答案是你设计你的应用程序,以便两个对象彼此了解。有很多具体方法可以实现这一目标。很多人会说"只需在应用代表中添加引用即可。" 是你可以做的一件事,但它并不总是最好的选择。如果您只是在应用代理中粘贴所有内容,它就会失控。有时它是正确的答案,通常其他事情是正确的答案。另一种方法是让一个知道这两个对象的对象将它们相互引入。但有时候没有这样的对象。所以它是情境化的。
答案 1 :(得分:1)
基本上,您需要维护指向原始视图的指针,而不是创建新的视图控制器。
我建议您在UIViewController
中存储AppDelegate
的实例,以便通过将其设为全局变量来保留您创建的视图控制器的特定实例。
离。在App Delegate.h中
#import "ViewController.h"
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic) ViewController *viewController;
然后从任何视图控制器&#39; .m需要读取/写入变量,创建指向应用程序代理的指针,例如:
#import "AppDelegate.h"
@interface WhateverViewController ()
AppDelegate *mainDelegate;
- (void)viewDidLoad {
mainDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
}
因此,无论您何时在代码中创建该视图控制器(在使用它之前),都可以使用此全局变量对其进行初始化。恩。如果你正在使用xibs:
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
答案 2 :(得分:0)
要从一个班级到另一个班级访问NSMutableArray
,请使用以下代码。
在您已声明NSMutableArray
对象的第一个视图控制器中,声明property
和synthesize
与下面相同,
//在FirstViewcontroller.h类中,
@property (nonatomic, strong) NSMutableArray *arrData;
//在FirstViewcontroller.m类中
@synthesize arrData;
FirstViewcontroller对象也应该是全局的,因此您可以在app委托文件中创建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
这是你需要的数组我希望它会对你有帮助。
答案 3 :(得分:0)
您在提供的代码中所做的是为可变数组设置公共属性...
@property (strong, nonatomic) NSMutableArray *selectedCells;
通过设置该属性,不会“创建”NSMutableArray
。在代码中的某些时候,您还必须通过初始化来创建NSMutableArray
...
NSMutableArray *selectedCells = [[NSMutableArray alloc] init];
或使用便利方法,例如......
NSMutableArray *selectedCells = [NSMutableArray arrayWithCapacity:(NSUInteger)<initialising capacity>];
或
NSMutableArray *selectedCells = [NSMutableArray arrayWithArray:(NSArray *)<initialising array>];
初始化NSMutableArray通常只进行一次。如果重复,则会覆盖用于指向数组的属性的内容。因此,有用的位置通常在viewDidLoad
视图控制器生命周期方法中。
答案 4 :(得分:0)
这里的基本思想是在原始类中,数组由指针引用。您的原始类将分配它并可能加载它。程序的其他部分可以传递属性的内容,这是一个指针,将它分配给它们自己的指针持有者,并使用它,就像你在那里声明它一样。请使用上面的代码;
MyClass *aClass = [[MyClass alloc] initWithMyInitStuff];
NSMutableArray *ThatArray = aClass.MyArray;
NSLog("Count of ThatArray: %d", [That.Array count]);