В iOS 6.1 UISwitch IBOutlet всегда равен нулю

У меня возникли проблемы при работе с UISwitch на статическом UITableView. Мне нужно восстановить последнее состояние определенного UISwitch при загрузке приложения, но всякий раз, когда я проверяю состояние IBOutlet, оно равно нулю. Я попытался вручную выделить переменную, что тоже не помогло.

Вот что я делаю:

НастройкиКонтроллер.h

//IBOutlet connected correctly
@property (strong, nonatomic) IBOutlet UISwitch *switch_displayDetail;

НастройкиController.m

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if (!_switch_displayDetail) {
        NSLog(@"_switch_displayDetail is NIL"); //This is always displayed
    }

    //Switch is default to YES, I am trying to set it to NO
    //This line does nothing...
    [_switch_displayDetail setOn:[dataManager shouldDisplayDetail] animated:YES];
}

Везде, когда я проверяю состояние _switch_displayDetail, оно равно нулю. Я вызываю все супер методы инициализации. Изменилось ли что-нибудь в iOS 6.1?

[EDIT] Использование синтезированной переменной также не работает.

[РЕДАКТИРОВАТЬ 2] Обнаружил, что проблема заключается в ошибке в Xcode или в симуляторе iPhone. После тестирования на моем iPod touch первоначальный алгоритм работал отлично.

Я схожу с ума от этой проблемы...


person Bruno Philipe    schedule 04.02.2013    source источник
comment
проверьте, делаете ли вы initWithNibName, а не только init в SettingsController   -  person Sathya    schedule 04.02.2013
comment
Также проверьте правильность написания названия пера.   -  person Fogmeister    schedule 04.02.2013
comment
попробуйте self.switch_displayDetail вместо _switch_displayDetail   -  person Ravindra Bagale    schedule 04.02.2013
comment
Разъединить/повторно связать розетки   -  person albertamg    schedule 04.02.2013


Ответы (3)


Я не понаслышке знаю, насколько неприятными могут быть проблемы с Сумеречной зоной. Очевидно, слишком мало информации для диагностики, но я решил поделиться своим подходом к отладке.

  1. Переопределите установщик для switch_displayDetail, там запишите значение, а также self
  2. Затем в viewWillAppear запишите то же самое

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

Просто мои два цента.

person mprivat    schedule 04.02.2013
comment
Спасибо. Я думал о том же. Я попробую это и опубликую результаты здесь. - person Bruno Philipe; 04.02.2013

Спасибо всем за ваши ответы, но после того, как я почти сдался, я протестировал свое приложение на своем iPod touch, и оно отлично сработало. Это похоже на ошибку в iPhone Simulator или, скорее всего, на ошибку в Xcode (здесь ничего нового). После сброса всех настроек и данных в меню iPhone Simulator заработало и там.

Поэтому, прежде чем сходить с ума, протестируйте свое приложение на реальном устройстве.

person Bruno Philipe    schedule 04.02.2013
comment
Сброс настроек и данных в Симуляторе мне тоже помог. Кроме того, я испытал это и на iOS 6.0. - person Frost; 12.02.2013

Первый :

@property (strong, nonatomic) IBOutlet UISwitch *switch_displayDetail; // should be a weak property

А потом ты @синтезировал свою собственность?

person Loris1634    schedule 04.02.2013
comment
В iOS 6.0 свойства не нужно синтезировать - person Bruno Philipe; 04.02.2013