在ViewControllers之间传递属性NSArray

时间:2013-12-16 18:25:08

标签: ios objective-c uitableview nsarray

我正在尝试从视图控制器1访问属性,因此我将代码放在SecondViewController的ViewDidLoad中:

 SeriesViewController *teste = [[SeriesViewController alloc] init];
 NSLog(@"%@", teste.seriesArray);

数组为null。 VC1中的财产声明是:

@property (strong, nonatomic) NSArray *seriesArray;

我在方法didSelectRowsAtIndexPath

中调用第二个VC
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *exercicios = [sb instantiateViewControllerWithIdentifier:@"ExerciciosViewController"];

    [super tableView:tableView didSelectRowAtIndexPath:indexPath];

    if ([[_seriesForDisplay objectAtIndex:indexPath.row] isEqualToString:@"Serie A"]) {
        [exercicios setTitle:[_seriesForDisplay objectAtIndex:indexPath.row]];
        NSLog(@"AGORA %@", array.exerciciosArray);

我也尝试了相反的方式,如下:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *exercicios = [sb instantiateViewControllerWithIdentifier:@"ExerciciosViewController"];

    [super tableView:tableView didSelectRowAtIndexPath:indexPath];

    if ([[_seriesForDisplay objectAtIndex:indexPath.row] isEqualToString:@"Serie A"]) {
        [exercicios setTitle:[_seriesForDisplay objectAtIndex:indexPath.row]];
        ExerciciosViewController *array = [[ExerciciosViewController alloc] init];
        array.exerciciosArray = _seriesArray;
        NSLog(@"AGORA %@", array.exerciciosArray);

但是当我到VC2时,虽然在VC1的代码中填充了exerciciosArray,但它是空的。

感谢。

更新

我正在实例化一个新的控制器。现在,我只是指着现有的一个。我现在得到一个不同的错误:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section, I have the lines: 

NSLog(@"CONTADOR bla %li", _exerciciosArray.count); and: 

return _exerciciosArray.count; 

我在崩溃前的日志中收到了4条消息:

-[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'.

2 个答案:

答案 0 :(得分:0)

在初始化视图控制器之后,但在引用它之前,可能没有填充数组。例如,如果要在viewDidLoad中填充数组,那么这可能是您的问题。

如果在init方法中填充数组,那么你应该没问题。所以, 可以 执行以下操作:

@implementation SeriesViewController 
-(id)init {
    self = [super init];
    if (self!=nil)
    {
         [self populateSeriesArray];
    }
    return self;
}
-(void)populateSeriesArray
{
     NSArray *arr = [NSArray arrayWithObjects:@"Foo", @"Bar", @"Baz", nil];
     self.seriesArray = arr;
}
@end

答案 1 :(得分:0)

您正在创建UIViewController的新实例,而不是指向现有/实例化的实例。这可能就是Array为空的原因。

您可以使用协议/委托,如下所述:How do I set up a simple delegate to communicate between two view controllers?

或者存储数组,例如在NSUserDefaults中。虽然NSUserDefaults并不适合这种存储,但它可以正常工作。