Проблемы с загрузкой inputAccessoryView

У меня есть приложение, которое просто состоит из UITextView. После загрузки приложения появляется клавиатура, а AccessoryView загружается поверх клавиатуры, чтобы закрыть ее.

Это работало великолепно, пока я не решил, что не хочу загружать клавиатуру при загрузке приложения. Проблема в том, что всякий раз, когда я пытаюсь отредактировать текст, приложение вылетает (EXC_BAD_ACCESS). Я не очень понимаю, почему это должно быть. Вот мой код - отмечен отрывок, который приводит к сбою приложения:

- (void)viewWillAppear:(BOOL)animated {

// Make the keyboard appear when the application launches.
[super viewWillAppear:animated];
// [textView becomeFirstResponder];} 

А потом:

- (BOOL)textViewShouldBeginEditing:(UITextView *)aTextView {


    // this crashes app if no keyboard is loaded in viewdidload:

        if (textView.inputAccessoryView == nil) {
        textView.inputAccessoryView = accessoryView;    
        self.accessoryView = nil;

}


    return YES;
}

Если я закомментирую последний оператор if, приложение заработает... но у меня нет аксессуара View. Возможно ли, что я сделал что-то не так в InterfaceBuilder? AccessoryView — это отдельное представление в моем ViewController. Однако он правильно подключен (и он отлично работает, если я запускаю приложение с включенной клавиатурой).

Любые идеи будут очень признательны. Извините, если это очевидно, но я все еще новичок, и эти вещи вызывают огромную головную боль.


person n.evermind    schedule 11.03.2011    source источник


Ответы (1)


Ошибки EXC_BAD_ACCESS возникают при попытке отправить сообщение объекту, который был освобожден. Убедитесь, что когда вы устанавливаете свои ivars, вы вызываете keep, если вы используете удобный метод, который возвращает автоматически выпущенный объект.

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

Я нашел пару руководств, на которые вы могли бы взглянуть:

http://www.fromconcentratesoftware.com/2007/08/09/nszombieenabled-for-the-debugger-adverse/

http://collateraldamag3.blogspot.com/2009/11/iphone-tutorial-nszombieenabled-and.html

person Simon Goldeen    schedule 11.03.2011
comment
Спасибо, действительно полезно! Что ж, получается, что я скопировал код из примера Apple для AccessoryView, и он объявляет представление аксессуаров как @property (nonatomic, assign) IBOutlet UIView *accessoryView; Теперь у меня есть @property (nonatomic, retain) IBOutlet UIView *accessoryView;, и приложение больше не падает. В чем именно разница между сохранением и назначением в этом случае? Apple загрузила перо аксессуара, в то время как мой аксессуарView является представлением моего перо ViewController - это причина? - person n.evermind; 12.03.2011
comment
@n.evermind разница между свойствами назначения и сохранения заключается в синтезированных методах установки. Для назначения установщик просто присваивает ivar переданное значение, для сохранения установщик освобождает старое значение, устанавливает для ivar новое значение и вызывает сохранение. Для получения дополнительной информации вы можете прочитать Declared Properties от Apple - person Simon Goldeen; 12.03.2011