2016-04-01 37 views
5

Po ostatniej aktualizacji Xcode ten kod, który działał, przestał działać. Większość Selector („:”) posiada automatyczną korekcję z wyjątkiem dla tego kodu:Nie deklarowano metody z selektorem Objective-C dla powiadomienia UIKeyboardWillShowNotification i UIKeyboardWillHideNotification

override func viewDidLoad() { 
    super.viewDidLoad() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil); 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil); 
} 

które flagi błędu:

No method declared with Objective C selector 'keyboardWillSHow:'

Ten obraz przedstawiają różne próby, które wszystko powiodło się.

enter image description here

Jaka jest nowa składnia dla tego kodu?

Odpowiedz

10

Przypisanie Selector jak poniżej:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.keyboardWillShow(_:)), name:UIKeyboardWillShowNotification, object: nil); 

A metoda aktualizacji co chcesz:

func keyboardWillShow(notification: NSNotification) { 

    //Update UI or Do Something 

} 

sam sposób można zrobić dla UIKeyboardWillHideNotification.

+1

Dzięki Sohil. To działa –

0

Zmieniono składnię szybką. Spróbuj tego:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #Selector(ClassThatHasTheSelector.keyboardWillShow), name:UIKeyboardWillShowNotification, object: nil); 
+0

Nadal zgłasza błąd: Wpisz: "SignInViewController" nie ma członka "KeyboardWillShow". Jeśli nie zaktualizowałeś Xcode, ten kod będzie działał. –

+0

Nie można znaleźć tej metody. Upewnij się, że keyboardWillShow jest dostępny w tej klasie, a nazwy pasują do siebie (zauważyłem wielką literę klawiatury). Nietypowe jest uruchamianie nazwy metody z wielką literą. –

+0

keyBoardWillShow nie był pisany wielkimi literami: przepraszam za literówkę. Nadal flagi z tym samym błędem, jak wspomniano powyżej. –

0

miałem te same problemy, a także dowiedzieć się, że klasa odnieść, musi być również podklasy z NSObject (co nie jest NECC. W przypadku Swifta) W przeciwnym wypadku pojawi się komunikat

error: argument of '#selector' refers to instance method 'yourMethod(notification:)' that is not exposed to Objective-C" 
0

szybka 3 składni (jak Sohil na wyżej)

func someMethod(sender: Any?) { 
     ... 
    } 

    func someBlockCallingWithSelector() { 
     someObject.addTarget(self, action: #selector(someMethod), for: .valueChanged) 
    } 
1

szybki 3 Przykład:

NotificationCenter.default.addObserver(self, selector: #selector(YourClass.keyboardWillShow(notification:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil); 
NotificationCenter.default.addObserver(self, selector: #selector(YourClass.keyboardWillHide(notification:)), name:NSNotification.Name.UIKeyboardWillHide, object: nil); 

// MARK: - Actions 

@objc private func keyboardWillShow(notification: Notification) { 
    print("keyboardWillShow called") 
} 

@objc private func keyboardWillHide(notification: Notification) { 
    print("keyboardWillHide called") 
}