2016-03-23 7 views
12

Ich habe den folgenden Code:Verwendung von Stringliteral für Objective-C-Selektoren ist veraltet, verwenden Sie '#selector' statt

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 
} 

ich folgende "Warnung" auf UIApplicationShortcutItem.respondsToSelector("new") bekommen, die sagt:

Verwendung von Stringliteral für Objective-c-Selektoren ist veraltet, verwenden Sie '#selector' statt

die Warnung mit dem Code automatisch ersetzt:

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

jedoch diese nicht kompilieren, weil new() unavailabe ist. Was soll ich in diesem Fall verwenden?

+0

überprüfen Sie dies ... vielleicht haben Sie etwas http://stackoverflow.com/questions/36147831/syntax-selector-swift-2-2 –

+0

Warum testen Sie für den Selektor "neu"? Ich sehe keinen Code, der die "neue" Nachricht hier sendet. –

Antwort

16

Xcode 7.3 rasche Verwendung für iOS9.3/watchOS2.2/...

Wenn Sie diese bisher verwendeten Codezeile:

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

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

Sie jetzt diese Codezeile verwenden sollten

zumindest hat mir Xcode angeboten, nachdem ich ein paar Zeichen im Code geändert habe. Scheint, es bietet nicht immer die richtige Lösung, wenn Sie mit diesem Fehler konfrontiert werden.

+1

Das hat bei mir besser funktioniert als die ausgewählte Antwort. – ded

+1

Upvoted - Das ist perfekt! –

+0

'button.addTarget (self, action: #selector (ViewController.onClickStart), für: .touchUpInside)' Ich benutze dieses. Vielen Dank ! @ Florian Uhlemann –

1

In dieser speziellen respondsToSelector Situation, wo Sie keine bestehende Verfahren, mit dem eine Funktion Bezug zu assoziieren, schreiben dies:

UIApplicationShortcutItem.respondsToSelector(Selector("new")) 

Sie noch eine Warnung bekommen (man sollte nicht, und ich einen Fehler dagegen gestellt haben), aber es wird eine andere Warnung sein, und Sie können sie ignorieren.

+2

Der eigentliche Witz ist, dass du _Sould_ in der Lage sein solltest, dies zu verlassen, indem du '#selector (NSObject.new)' sagst, da das wirklich das 'neue' ist, was du meinst. Aber wenn Sie das sagen, erhalten Sie einen Fehler statt einer Warnung! – matt

+2

@gotnull Hier ist Apples Antwort auf meinen Fehlerbericht: "Engineering hat festgestellt, dass Ihr Fehlerbericht (24815319) ein Duplikat eines anderen Problems (24791200) ist und geschlossen wird." Bitte, fühlen Sie sich frei, anzuhäufen: je mehr Duplikate, desto besser. – matt

6

Erstellen Sie ein Protokoll, dessen einziger Grund für das Bestehen darin besteht, dass Sie den entsprechenden Selektor erstellen können. In diesem Fall:

@objc protocol NewMenuItemHandling { 
    func new() 
} 

Sie nehmen das informelle Protokoll (ein Objekt, das auf den neuen Selektor anspricht) und es in ein formales Protokoll zu machen.

Dann, wo Sie den Selektor verwenden möchten, können Sie den Ausdruck hinzufügen:

#selector(NewMenuItemHandling.new) 
+1

Devilishly hinterhältig. – matt

+0

Ich weiß nicht, dass ich es hinterhältig nennen würde. Im Grunde stützt sich Objective-C sehr auf informelle Protokolle (oder Duck Typing, wenn Sie bevorzugen). Swift möchte bei Protokollen etwas formeller sein. Also hast du ein informelles Protokoll genommen und Swift gesagt, dass es existiert :-) –

0

Zusammenfassend ist jeder "Selektor: Funktion oder Objekt" jetzt "selector: #selector (class.funtion (_ :))", wo immer er verwendet wird.

Verwandte Themen