2016-04-01 37 views
5

Xcode'un son güncellemesinden sonra, çalışmak için kullanılan bu kod artık çalışmıyor. (":") Seçici çoğu bu kodu için istisna ile bir otomatik düzeltme vardır:Bildirim Yöntemi için Objective-C Seçici ile bildirilmemiş Yöntem UIKeyboardWillShowNotification ve 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); 
} 

hangi bayrakları bir hata: Bütün başarısız olmuş

No method declared with Objective C selector 'keyboardWillSHow:'

Bu görüntü göstermek farklı girişimler. Bu kod için yeni sözdizimi

enter image description here

nedir?

cevap

10

aşağıda Selector ata::

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

Ve yöntemi istediğini güncellemek için: Bu deneyin Eğer UIKeyboardWillHideNotification için yapabileceği

func keyboardWillShow(notification: NSNotification) { 

    //Update UI or Do Something 

} 

aynı şekilde. Aynı sorunlar vardı ve ayrıca üzerinde başvurmak sınıfı da NSObject (UETM değildir. Swift durum) dan sınıflandırma gerektiğini öğrenmek gelmiş

+1

Teşekkürler Sohil. İşe yarıyor –

0

Hızlı sözdizimi değişti.

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

Hala bir hata bildiriyor: Tür: 'SignInViewController', 'KeyboardWillShow' üyesi yok. Xcode'u güncellemediyseniz, bu kod işe yarayacaktır. –

+0

Bu yöntemi bulamıyor. Bu sınıfta keyboardWillShow'un bulunduğundan ve adların eşleştiğinden emin olun (hata mesajını büyük harfli Klavyede gördüm). Bir büyük harfle bir yöntem adı başlatmak alışılmışın dışında. –

+0

keyBoardWillShow büyük harfle yazılmadı: yazım hatası için üzgünüz. Yine de, yukarıda belirtilenle aynı hataya işaret ediyor. –

0

Aksi takdirde mesaj almak

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

(sadece sohil en yukarıdaki gibi) Swift 3 sözdizimi:

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

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

Swift 3 örnek:

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") 
}