指向NSMutableArray的指针返回Null

时间:2014-03-16 17:57:12

标签: ios objective-c uiviewcontroller nsmutablearray

我正在尝试使用NSMutableArrayViewController创建的ViewController2。但它只是返回nil

这是我的ViewController.h文件:

@property (nonatomic, strong) NSMutableArray *total_hours;

这是我的ViewController.m文件:

 total_hours = [[NSMutableArray alloc] init];

我也添加了对象。使用NSLog显示实际已添加的内容,以便正常工作。但现在我尝试使用NSLog在另一个ViewController2中再次显示它们。

这是我的ViewController2.h文件:

@property(nonatomic, assign)NSMutableArray*total_hours_copy;

这是我的ViewController2.m文件:

#import "TimelisteViewController.h"
// some auto enabled code
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    TimelisteViewController *test = [[TimelisteViewController alloc]init];
    NSMutableArray *total_hours_copy = test.total_hours;

    NSLog(@"%@", [total_hours_copy objectAtIndex:0]);
}

为什么这不起作用?

4 个答案:

答案 0 :(得分:2)

您的问题意味着您在ViewController中创建数组,并希望稍后将其传递给ViewController2。但是,在ViewController2的viewDidLoad方法中,您将创建一个ViewController的新实例。这是一个问题。

在以下情况下回答您的问题会更容易:

  1. 您指出了初始化total_hours的方法。
  2. 如何在两个控制器之间传输控制。

答案 1 :(得分:1)

您没有在正确的位置初始化阵列。 viewDidLoad仅在显示视图控制器时调用,而不是在初始化时调用。 您可以在视图控制器中覆盖init方法:

- (void)init{
    [super init];
    total_hours = [[NSMutableArray alloc] init];
}

然而,这不是通常的模式,我不会推荐它。我不确定你要做什么,但我相信最好在viewcontroller2中初始化你的数组并将其传递给你的新初始化控制器。

TimelisteViewController *test = [[TimelisteViewController alloc]init];
NSMutableArray *total_hours = [[NSMutableArray alloc] init];
//Add your data in the array
test.total_hours = total_hours;

答案 2 :(得分:0)

基于 Paul Lalonde 这一事实,如果您需要将数组从视图控制器传递到另一个控制器,您可以采用两种方式。

  • 创建一个共享数组的单例类(这样每个控制器都可以访问该单例,从而访问该数组)
  • 将阵列从控制器注入另一个控制器(首选方式,因为它允许解耦组件并且应用程序刚性较小)

因此,在第二个解决方案之后,从ViewController1开始注入数组,如下面的代码片段所示。现在两个控制器将共享相同的阵列。一个控制器进行的修改对另一个控制器可见,反之亦然......

ViewController2 secondController = // alloc-init here…
secondController.sharedArray = [self sharedArray];

其中ViewController2会有像

这样的属性
@property (nonatomic, strong) NSMutableArray* sharedArray;

然后,例如,在其viewDidLoad内或您想要的任何地方,您可以说

[self.sharedController add…]

说这个,你的申请流程是什么?例如,ViewController2ViewController1之后显示UINavigationController或类似内容的控件是{{1}}吗?

答案 3 :(得分:0)

total_hours_copyviewDidLoad方法中的局部变量,而不是属性!将您的代码更改为

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    TimelisteViewController *test = [[TimelisteViewController alloc]init];
    self.total_hours_copy = test.total_hours;
    // or maybe self.total_hours_copy = [test.total_hours copy];

    NSLog(@"%@", [total_hours_copy objectAtIndex:0]);
}