Уведомления клавиатуры вызывают сбой EXC_BAD_ACCESS
У меня есть приложение, которое вылетает при попытке обработать уведомления клавиатуры. Я использую xCode 6.0, и проект находится в Swift.
Пытаясь изолировать проблему, я создал новое приложение, которое содержит только UITextView
с и 4 ограничениями, которые прикрепляют вид к верхнему, левому и правому краям и устанавливают фиксированную высоту.
Все что мое ViewController
имеет следующее:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.observeKeyboard()
}
override func viewDidDisappear(animated: Bool) {
NSNotificationCenter().removeObserver(self)
}
func observeKeyboard() {
NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector(keyboardWillAppear()), name:UIKeyboardWillChangeFrameNotification, object:nil)
}
func keyboardWillAppear() {
println("keyboardWillAppear")
}
}
Когда я запускаю приложение в симуляторе,
keyboardWillAppear
выводится на консоль, и когда я нажимаю внутри текстового представления, приложение вылетает с:
EXC_BAD_ACCESS code=1:
Ошибка: memory read failed for 0x0
Клавиатура показана, но другая keyBoardWillAppear
не выводится на консоль.
В этом приложении больше ничего нет, только код выше и 4 ограничения. Я только что открыл новый проект, пытаясь изолировать проблему, с которой я столкнулся в моем другом приложении. Я также пытался подписаться на уведомления в viewDidAppear
и я тоже попробовал с другим уведомлением UIKeyboardWillShowNotification
а также UIKeyboardDidShowNotification
, но результат всегда один и тот же.
Что мне не хватает? Ваша помощь ценится!
2 ответа
Вы делаете селектор с возвратом функции keyboardWillAppear()
, Попробуйте сделать это, используя строку: Selector("keyboardWillAppear:")
,
Также примечание: вы регистрируете уведомление клавиатуры в viewDidLoad
который обычно вызывается только один раз за жизненный цикл контроллера представления. Лучше зарегистрироваться для этих уведомлений в viewWillAppear:
,
Первое решение - спать, прежде чем ударить головой о стену.
Утром я разобрался в своей проблеме. Что я сделал не так, так это регистрация на уведомление с неправильным селектором. В обработчик уведомлений передается параметр, поэтому селектор должен быть: selector:"keyboardWillAppear:"
, с двоеточием, указав, что это функция, которая принимает параметр.
Так что вместо:
NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector(keyboardWillAppear()), name:UIKeyboardWillChangeFrameNotification, object:nil)
Я должен использовать:
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillAppear:", name: UIKeyboardWillChangeFrameNotification, object: nil)
Спасибо всем, кто пытался помочь, и я надеюсь, что это поможет другим новичкам в Swift.