2013-03-12 6 views
0

У меня есть два контроллера вида: BSViewController, который содержит исходные ivars number и array и BSotherViewController, которые в качестве цели должны получить ивары. (BSViewController имеет кнопку на ней, которая составляет до BSotherViewController.)получить ivar в другом классе

Как получить доступ к значению двух иваров в BSotherViewController?

BSViewController.h

#import <UIKit/UIKit.h> 

@interface BSViewController : UIViewController 
@property (nonatomic) NSInteger number; 
@property (nonatomic, weak) NSArray * array; 
@end 

BSViewController.m

#import "BSViewController.h" 

@interface BSViewController() 
@end 
@implementation BSViewController 
@synthesize number; 
@synthesize array; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    BSViewController *view = [[BSViewController alloc] init]; 
    NSArray* _array = [NSArray arrayWithObjects: @"manny",@"moe",nil]; 
    view.array = _array; 
    view.number = 25; 
} 

@end 

BSotherViewController.h

#import <UIKit/UIKit.h> 

@class BSViewController; 
@interface BSotherViewController : UIViewController 
@end 

BSotherViewController.m

Проблема в том, что ниже aview.number - 0, а не 25; и aview.array - null.

#import "BSotherViewController.h" 
#include "BSViewController.h" 
@interface BSotherViewController() 

@end 

@implementation BSotherViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    BSViewController *aview = [[BSViewController alloc] init]; 
    NSLog(@"other view: %@", aview); 
    NSLog(@"other number: %d", aview.number); // produces 0, not desired 25 
    NSLog(@"other array: %@", aview.array); // produces null, not desired manny,moe 
} 
@end 

ответ

1

Когда вы создаете экземпляр BSViewController из BSOtherViewController вы вызываете метод инициализации. Значения устанавливаются в viewDidLoad в BSViewController, и этот метод не будет вызываться до фактического загрузки представления.

Попытка переопределить метод инициализации и установите значения

- (id)init { 

if (self = [super init]) { 
    //Set values 
    NSArray* _array = [NSArray arrayWithObjects: @"manny",@"moe",nil]; 
    self.array = _array; 
    self.number = 25; 
} 
return self; 
} 
+0

Как я могу это исправить? Если я поставлю '@property (сильный, неатомный) BSViewController * view;' в .h, я получаю несовместимый тип свойства. – zerowords

+0

Добавьте метод init в BSViewController и установите значения в этом методе – johan

+0

Это мошенничество, не так ли, потому что 'init' выполняется до того, как известны значения числа и массива. Я попытался создать еще один массив массивов чисел: - (id) initWithNumber: (NSInteger): (NSArray *) { self = [super init]; if (self) { _number = number; _array = array; return self; } return nil; } 'и называть его после вычисления' number' и 'array', но я получаю 0 и нулевые результаты. Можете ли вы, пожалуйста, отреагировать на эти идеи? – zerowords

0

Замените BSViewController viewDidLoad метод с INIT как это:

- (id)init { 

if (self = [super init]) { 

    NSArray* _array = [NSArray arrayWithObjects: @"manny",@"moe",nil]; 
    self.array = _array; 
    view.number = 25; 

} 
return self; 
} 
+0

Хороший ответ. Выглядит много как мой :) Я думаю view.array следует заменить self.array. – johan

+0

oops .... копия, вставленная из кода zerowords ... не заметила это .. исправление теперь ... tnx :) @Johan: init будет таким, кто отвечает на эти вопросы .... так может быть его выглядит аналогичным ..;) –

+0

См. мой комментарий к другому ответу (об обмане?). – zerowords