从另一个类访问NSMutableArray - Objective C

时间:2014-04-16 04:19:51

标签: ios objective-c

我有一个包含指定类的主ViewController。在ViewController内,有Containerembed 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

5 个答案:

答案 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对象的第一个视图控制器中,声明propertysynthesize与下面相同,

//在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]);