2016-03-23 10 views
12

ho il seguente codice:L'uso della stringa letterale per selettori Objective-C è deprecato, usare '#selector' invece

func setupShortcutItems(launchOptions: [NSObject: AnyObject]?) -> Bool { 
    var shouldPerformAdditionalDelegateHandling: Bool = false 

    if (UIApplicationShortcutItem.respondsToSelector("new")) { 
     self.configDynamicShortcutItems() 

     // If a shortcut was launched, display its information and take the appropriate action 
     if let shortcutItem: UIApplicationShortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { 
      // When the app launched at the first time, this block can not called. 
      self.handleShortCutItem(shortcutItem) 

      // This will block "performActionForShortcutItem:completionHandler" from being called. 
      shouldPerformAdditionalDelegateHandling = false 
     } else { 
      // normal app launch process without quick action 
      self.launchWithoutQuickAction() 
     } 
    } else { 
     // Less than iOS9 or later 
     self.launchWithoutQuickAction() 
    } 

    return shouldPerformAdditionalDelegateHandling 
} 

ricevo il seguente "warning" su UIApplicationShortcutItem.respondsToSelector("new"), che dice:

l'uso della stringa letterale per Objective-C selettori è deprecato, l'uso '#selector' invece

l'avviso sostituisce automaticamente il codice con:

UIApplicationShortcutItem.respondsToSelector(#selector(FBSDKAccessToken.new))

Tuttavia questo non compila perché new() è unavailabe. Cosa dovrei usare in questo caso?

+0

verifica questo ... potresti avere qualcosa http://stackoverflow.com/questions/36147831/syntax-selector-swift-2-2 –

+0

Perché stai testando il selettore 'new'? Non vedo alcun codice che invii il messaggio 'new' qui. –

risposta

16

Xcode 7.3 utilizzando Swift per iOS9.3/watchOS2.2/...

Se utilizzato in precedenza questo riga di codice:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateResult:", name: "updateResult", object: nil) 

si dovrebbe ora utilizzare questa riga di codice:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(InterfaceController.updateResult(_:)), name: "updateResult", object: nil) 

almeno questo è ciò che Xcode mi ha offerto dopo aver cambiato alcuni caratteri nel codice. Sembra che non offra sempre la soluzione corretta quando ti viene presentato questo errore.

+1

Questo ha funzionato per me, meglio della risposta selezionata. – ded

+1

Upvoted - Questo è perfetto! –

+0

'button.addTarget (self, action: #selector (ViewController.onClickStart), per: .touchUpInside)' Lo uso. Grazie ! @Florian Uhlemann –

1

In questo speciale respondsToSelector situazione, in cui si dispone di alcun metodo esistente a cui associare un riferimento alla funzione, scrivere questo:

UIApplicationShortcutItem.respondsToSelector(Selector("new")) 

Ci si può comunque un avvertimento (non si dovrebbe, mi e' ve ne ha segnalato un bug), ma sarà un avvertimento diverso e puoi ignorarlo.

+2

La vera barzelletta è che tu dovresti essere in grado di uscire da questo dicendo '#selector (NSObject.new)', dal momento che questo è veramente il 'nuovo' che intendi. Ma quando lo dici, ricevi un errore invece di un avvertimento! – matt

+2

@gotnull Ecco la risposta di Apple alla mia segnalazione di bug: "Engineering ha stabilito che la segnalazione di bug (24815319) è un duplicato di un altro problema (24791200) e verrà chiusa." Per favore, sentitevi liberi di accumularvi: più duplicati, meglio è. – matt

6

Creare un protocollo il cui unico motivo per esistere è quello di consentire di costruire il selettore appropriato. In questo caso:

@objc protocol NewMenuItemHandling { 
    func new() 
} 

State prendendo il protocollo informale (un oggetto che risponde al nuovo selettore) e rendendolo in un protocollo formale.

Poi in cui si desidera utilizzare il selettore è possibile aggiungere l'espressione:

#selector(NewMenuItemHandling.new) 
+1

Devilishly furtivamente. – matt

+0

Non so se lo definirei subdolo. Fondamentalmente l'Objective-C si basa molto su protocolli informali (o Duck Typing se si preferisce). Swift vuole essere un po 'più formale sui protocolli. Quindi hai preso un protocollo informale e hai detto a Swift che esiste :-) –

0

In sintesi, ogni "selettore: funzione o oggetto" è ora "selettore: #selector (class.funtion (_ :))" ovunque utilizzato.