avere il codice seguente:trascinamento dove clausola di estensione di tipo non generico
func registerNotification(name:String, selector:Selector)
{
NSNotificationCenter.defaultCenter().addObserver(self, selector: selector, name: name, object: nil)
}
func registerKeyboardNotifications()
{
let isInPopover = navigationController?.popoverPresentationController != nil
let ignore = isInPopover && DEVICE_IS_IPAD
if !ignore {
registerNotification(UIKeyboardWillShowNotification, selector: Selector("keyboardWillShow:"))
registerNotification(UIKeyboardWillHideNotification, selector: Selector("keyboardWillHide:"))
}
}
in un'estensione UIViewController
. Questo codice viene riutilizzato da molti viewcontroller per registrare le notifiche della tastiera. Tuttavia con Swift 2.2 produce un avvertimento. Mi piace la nuova sintassi #selector
ma non sono sicuro di come implementarla in questo caso.
Penso che la soluzione corretta sia quella di creare un protocollo ed estendere UIViewController
solo per le istanze conformi a tale protocollo. Il mio codice finora:
@objc protocol KeyboardNotificationDelegate
{
func keyboardWillShow(notification: NSNotification)
func keyboardWillHide(notification: NSNotification)
}
extension UIViewController where Self: KeyboardNotificationDelegate
{
func registerKeyboardNotifications()
{
let isInPopover = navigationController?.popoverPresentationController != nil
let ignore = isInPopover && DEVICE_IS_IPAD
if !ignore {
registerNotification(UIKeyboardWillShowNotification, selector: #selector(KeyboardNotificationDelegate.keyboardWillShow(_:)))
registerNotification(UIKeyboardWillHideNotification, selector: #selector(KeyboardNotificationDelegate.keyboardWillHide(_:)))
}
}
}
Tuttavia questo mi ottengo l'errore
trailing where clause for extension of non-generic type
sulla riga di estensione. Qualche idea?
Questo mi ha aiutato enormemente. Stavo facendo il contrario, 'estensione UIViewController dove Self: UICollectionViewDelegate' ma non mi ero reso conto che doveva essere capovolto con il delegato sulla sinistra. – barndog