2014-12-08 3 views
0

Я пытаюсь передать массив NSMutable из класса View Controller в класс UIView.Передача NSMutableArray в класс UIView становится nil

Код:

UIView.h class 

-(void)init:(NSMutableArray *)ary; 

@property (nonatomic, retain) NSMutableArray *valenceArray; 

UIView.m 

-(void)init:(NSMutableArray *)ary 
{ 
    self.valenceArray = [[NSMutableArray alloc] initWithArray:ary]; 
    NSLog(@"%@",_valenceArray); 
} 

-(void) drawgraph 

{ 
    for (int i = 0; i < _valenceArray.count; i++) 
    { 
     NSString *string = [_valenceArray objectAtIndex:i]; 
     double value = [string doubleValue]; 
     NSLog(@"%f", value); 
    } 
} 

Инициализационного метод выводит содержимое массива прошел. Но когда я вызываю метод draw draw, массив сбрасывается до nil.

Код для установки массива:

Grid *grid = [[Grid alloc] init]; 
[grid init:_array]; 

Любая идея о том, что я делаю неправильно?

+0

Я предлагаю вам изменить имя метода '- (Недействительными) инициализации: (NSMutableArray *) ary', который имеет такое же имя со стандартным методом инициализации. – KudoCC

ответ

0

Я не думаю, что вам нужно инициализировать массив, если вы передаете их из другого UIView или контроллера. Это потому, что вы повторно инициализируете массив. Просто удалите метод init & непосредственно передать массив методу draw без какой-либо инициализации.

-(void) drawgraph:(NSMutableArray *)ary 
{ 
    NSLog(@"%@",ary); 
} 

& называют это

[grid drawgraph:_array]; 
+1

Конечно, это исправление, но это не объясняет/не исправляет ту часть, где он может захотеть удержать массив для последующего использования. Итак, по крайней мере, в функции графика графика добавьте «self.valenceArray = ary;» –

+0

@ ŃikeKamstra: его можно использовать в любом месте этого класса. – Ajay

0

Если сетка вида является выходом viewController. Вы должны использовать свойство outlet для вызова функции init. Возможно, поскольку @KudoCC сказал, что вам нужно изменить имя метода.

0

Я не уверен, если это будет исправить это, но ваш метод:

-(void)init:(NSMutableArray *)ary {} 

должен вернуть себе (UIView), иначе ссылка остается пустой. Кроме того, поскольку ваш инициализационный могли (если не хотя) перезаписать обычные инициализации, может запутывает все так изменить это что-то вроде:

.h:

-(id)initWithArray:(NSMutableArray *)ary; 

.m:

-(id)initWithArray:(NSMutableArray *)ary 
{ 
    self = [super init]; 
    self.valenceArray = ary; 
    NSLog(@"%@",_valenceArray); 
    return self; 
} 

В противном случае проверьте, действительно ли заполнен массив, который отправляется.

Кроме того, я не заметил класс Grid, который должен быть изменен на:

Grid *grid = [[Grid alloc] initWithArray:_array]; 
+0

Не работает. Массив заполняется, потому что NSLog внутри init позволяет распечатать содержимое массива. Но когда я вызываю метод drawgraph внутри этого класса. Массив сбрасывается на ноль. – user2512523

+0

hmm вы могли бы поделиться выходом массива (NSLog), когда он будет вызван в init? –

+0

2014-12-08 12: 20: 26,416 AffectVisualiser [1929 3847613] ( 1, 1, "-1", 1, "-1", 1, "-1" ) – user2512523

2

Заменить init метод с кодом ниже:

-(void)init:(NSMutableArray *)ary 
{ 
    _valenceArray = [[NSMutableArray alloc] initWithArray:ary]; 
    NSLog(@"%@",_valenceArray); 
} 

доступа также его использованием в методе self.valenceArray графа. Также назначить self.valenceArray от значения параметра массива:

-(void) drawgraph:(NSMutableArray *)ary { 

    self.valenceArray = ary; 

    for (int i = 0; i < _valenceArray.count; i++) 
    { 
     NSString *string = [self.valenceArray objectAtIndex:i]; 
     double value = [string doubleValue]; 
     NSLog(@"%f", value); 
    } 
} 

Переменная экземпляра является переменной, которая существует и держит его значение для жизни объекта. Память, используемая для переменных экземпляра, выделяется, когда объект сначала создается (через alloc) и освобождается, когда объект освобождается.

Если вы не указали иначе, синтезированная переменная экземпляра имеет то же имя, что и свойство, но с префиксом подчеркивания.Например, для свойства, называемого firstName, переменная синтезированного экземпляра будет называться _firstName.

Хотя для доступа к своим свойствам лучше использовать объекты с помощью методов доступа или точечного синтаксиса, можно получить доступ к переменной экземпляра непосредственно из любого из методов экземпляра в реализации класса.

Encapsulating Data

Смежные вопросы