Почему метод init устанавливает этот ivar в (null)? - PullRequest
0 голосов
/ 25 октября 2011

Я не понимаю, почему добавление метода init к моему контроллеру представления устанавливает для некоторых иваров значение (null), когда некоторые данные передаются на этот контроллер.Вот код, который я использую для установки некоторых значений ivar и вызова соответствующего контроллера представления:

MyViewController *vc = [[MyViewController alloc] init];
vc.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];

В MyViewController, search_type ivar содержит строку @"buy", сохраненную в предыдущем контроллере представления, как и ожидалось,Однако, когда я добавляю метод init ниже, search_type всегда содержит строку (null), когда я пытаюсь использовать ее в MyViewController:

(id)init
{
   self = [super init];
   if(self)
   {
        // some other code here
   }
   return self;
}

search_type объявляется в интерфейсе как:

@property (nonatomic,retain) NSMutableString *search_type;

и синтезировать в файле реализации:

@synthesize search_type;

Ответы [ 3 ]

1 голос
/ 25 октября 2011

Не совсем понятно, что вы пытаетесь сделать, но если вы говорите, что search_type - это ноль в вашем init методе, в который вы поместили // some other code here, то это потому, что ваш контроллер вида инициализируется до того, как вы установитесвойство.

Если вам нужно передать этот объект в контроллер представления перед запуском какого-либо кода, у вас есть несколько вариантов:

  • Создайте пользовательский инициализатор, такой как initWithSearchType:.
  • Создайте пользовательский установщик для этого свойства.
  • Выполните код в viewDidLoad, viewWillAppear или аналогичном методе.

То, что из этого подходит, зависит отименно то, что вы делаете.

0 голосов
/ 25 октября 2011

Вы не обращаетесь к переменной экземпляра в этом коде

MyViewController *vc = [[MyViewController alloc] init];
MyViewController.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];

Вы создаете экземпляр с именем vc, но не используете его. Попробуйте вместо этого:

MyViewController *vc = [[MyViewController alloc] init];
vc.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];

НТН.

Обновление

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

// in the header file
@property(nonatomic, copy) NSMutableString *search_type;

// in your implementation
@synthesize search_type = m_search_type;

Если вы сделали это, вам, вероятно, следует поделиться большим количеством своего MyViewController источника. Не имеет значения, инициализируете ли вы переменную в своем методе init, потому что вы присваиваете ей новое значение после того, как в любом случае создадите его.

0 голосов
/ 25 октября 2011

search_type является изменяемым, вы инициализируете в методе инициализации MyViewController?

...