iOS5: путаница с переменными loadview, init и instance - PullRequest
6 голосов
/ 13 ноября 2011

Я новичок в iOS5 и раскадровке.

Я заметил, что если я объявляю переменные экземпляра внутри моего файла viewcontroller .h и задаю значения внутри моего init .m файла моего viewcontroller, когдаПредставление viewcontroller отображается, мои переменные экземпляра показывают нулевой внутри viewDidLoad.Чтобы получить мои переменные, мне нужно сделать [self init] внутри viewDidLoad.Мои вопросы:

@interface tableViewController : UITableViewController
{
NSMutableArray *myvariable;
}
@end

@implementation tableViewController
-(id)init
{
myvariable = [[NSMutableArray alloc]initWithObjects:@"Hi2",@"Yo2",@"whatsup2", nil];
}

- (void)viewDidLoad
{
NSLog(@"%@",myvariable); // DISPLAYS NULL
[super viewDidLoad];
}
  1. Почему мои переменные не доступны в viewdidLoad, когда я объявлен и реализован в моих файлах .h и .m?
  2. Если это так,Является ли viewDidLoad или viewWillAppear общими местами для загрузки данных для viewcontroller?
  3. Похоже, что даже когда вы создаете экземпляр viewcontroller и вызывается функция init, viewDidLoad не обязательно имеет переменные для отображения.
  4. Где подходящее место / методы для загрузки модели (данных) для моего viewcontroller?

Заранее спасибо

1 Ответ

14 голосов
/ 13 ноября 2011

Итак, чтобы ответить на ваш первый вопрос, инициализатор, который вызывается в этом случае, является initWithCoder:, а не init.Поэтому, если вы перенесете инициализацию NSArray туда на initWithCoder: вы должны обнаружить, что она доступна до загрузки вашего представления.

Не забудьте также вызвать инициализатор вашего суперкласса.Таким образом, такой шаблон будет работать:

-(id)initWithCoder:(NSCoder *)aDecoder {

    if ((self = [super initWithCoder:aDecoder])) {

        // initialize what you need here
    }

    return self;

}

Вы также получите awakeFromNib , вызванный после initWithCoder: и после того, как все ваши розетки были подключены, так что если вашинициализация зависит от заполняемых торговых точек, тогда есть возможность выполнить эту инициализацию там.

И, конечно, у вас есть viewDidLoad и viewWillAppear: .Я не знаю, есть ли общий ответ на «правильный» метод для использования (вопросы 2 и 4).Это зависит от того, сколько у вас есть данных, как часто их нужно обновлять и сколько времени требуется для загрузки.Мое мнение таково, что это решение должно приниматься для каждого случая.

По вопросу № 3, у вас есть пример того, что вы видели там?Инициализатор определенно будет вызываться перед viewDidLoad.Хитрость заключается в том, чтобы узнать, какой инициализатор вызывается.

Имейте в виду, что viewDidLoad может вызываться несколько раз в течение срока службы контроллера представления.Так что будьте готовы к этому.И, конечно, viewWillAppear: будет вызываться несколько раз в течение срока службы контроллера представления.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...