Уведомления клавиатуры вызывают сбой 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.

Другие вопросы по тегам