Aufruf des Selektors aus der Protokollerweiterung

8

Ich baue eine einfache Theme-Engine und hätte gerne eine Erweiterung, die UISwipeGestureRecognizer zu UIViewController

hinzufügt

Hier ist mein Code:

%Vor%

Natürlich kann der Compiler #selector(Self.switchCurrentTheme) nicht finden, da er nicht über die @objc -Direktive verfügbar gemacht wird. Ist es möglich, dieses Verhalten meiner Erweiterung hinzuzufügen?

UPDATE: Theme ist eine Swift-Enumeration, daher kann ich @objc nicht vor Themeable protocol

hinzufügen     
OgreSwamp 14.04.2016, 16:52
quelle

4 Antworten

11

Die sauberste funktionierende Lösung, die ich mir vorstellen konnte, war eine private Erweiterung auf UIViewController mit der fraglichen Methode zu definieren. Durch Begrenzen des Bereichs auf private wird der Zugriff auf diese Methode in der Quelldatei isoliert, in der das Protokoll definiert ist. So sieht es aus:

%Vor%     
Dan Loewenherz 08.07.2016 21:36
quelle
0

Ich bin mir nicht sicher, aber Sie können darauf zugreifen wie

%Vor%

oder Sie können diesen Link verwenden, um es zu versuchen    Besuchen Sie Wie verwenden Sie #selector (myMethodName) in einer Protokollerweiterung?

    
Akash Soni 14.04.2016 17:11
quelle
0

Haben Sie darüber nachgedacht, einen Wrapper zu erstellen, mit dem Sie Ihre non @ objc-Funktion von einer @objc-Funktion aus aufrufen können?

%Vor%     
Clafou 15.04.2016 11:32
quelle
0

Ich habe eine Lösung gefunden. Mag nicht der perfekte sein, aber es funktioniert. Da ich Themeable protocol nicht als @objc definieren kann, weil es Swift-only enum verwendet, habe ich mich entschieden, die Methode zu verschieben, die ich zum "elterlichen" Protokoll aufrufen möchte, und dieses Protokoll als @objc definieren. Es scheint, als ob es funktioniert, aber ich mag es nicht wirklich, um ehrlich zu sein ...

%Vor%     
OgreSwamp 15.04.2016 10:36
quelle