Ich versuche meine App in die Swift-Sprache zu konvertieren.
Ich habe diese Codezeile:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
Wie konvertiere ich es in Swift?
In Apples Dokumenten gibt es keine solche Methode.
ios
swift
uiappearance
AlexZd
quelle
quelle
Antworten:
Update für iOS 9:
Wenn Sie auf iOS 9+ (ab Xcode 7 b1) abzielen, gibt es eine neue Methode im
UIAppearance
Protokoll, die keine varargs verwendet:Welches kann so verwendet werden:
Wenn Sie iOS 8 oder früher noch unterstützen müssen, verwenden Sie die folgende Originalantwort auf diese Frage.
Für iOS 8 & 7:
Diese Methoden stehen Swift nicht zur Verfügung, da Obj-C-Varargs-Methoden nicht mit Swift kompatibel sind (siehe http://www.openradar.me/17302764 ).
Ich habe eine nicht-variadische Problemumgehung geschrieben, die in Swift funktioniert (ich habe dieselbe Methode für wiederholt
UIBarItem
, von der nicht abstammtUIView
):- -
Stellen Sie einfach sicher, dass Sie
#import "UIAppearance+Swift.h"
in Ihrem Bridging-Header.Um dann von Swift aus anzurufen (zum Beispiel):
quelle
ios 10 swift 3
quelle
Für iOS 8 & 7:
Ich verwende eine Kategorie basierend auf Alex 'Antwort, um mehrere Container anzugeben. Dies ist eine Problemumgehung, bis Apple
appearanceWhenContainedIn
Swift offiziell unterstützt .UIAPerance + Swift.h
UIAPerance + Swift.m
Fügen Sie
#import "UIAppearance+Swift.h"
dann Ihrem Bridging-Header hinzu.Verwendung von Swift :
Es war gut, wenn ich mit CVarArgType einen Weg finden konnte , aber ich fand keine saubere Lösung.
quelle
Hier ist eine weniger hässliche, aber immer noch hässliche Problemumgehung, die von @tdun inspiriert wurde.
AppearanceBridger
.AppearanceBridger
named+(void)setAppearance
und fügen Sie den Objective-C-Erscheinungscode in diese Methode ein. Beispielsweise:AppearanceBridger.setAppearance()
Sie in Ihrem Swift-Code, in dem Sie das Erscheinungsbild festlegen, an und Sie sollten bereit sein!Hoffe, das funktioniert gut für Leute, die es sehen.
quelle
Hier ist eine hässliche Problemumgehungslösung, die ich verwendet habe ...
Erstellen Sie einfach eine Objective-C Cocoa Touch-Klasse (UIViewController) mit einem beliebigen Namen.
Ich habe meine benannt
WorkaroundViewController
...Jetzt in (
WorkaroundViewController.m
):Führen Sie den Objective-C-Erscheinungscode für aus
.appearanceWhenContainedIn()
(hier ist mein Beispiel):Dann erstellen Sie eine Überbrückung Header für Ihr Swift Projekt und dann initialisieren Ihren Objective-C Viewcontroller in Ihrem Swift Code wie folgt (auch hier nur mein Beispiel):
Dann bist du fertig! Lassen Sie mich wissen, ob es für Sie funktioniert ... Wie ich schon sagte, es ist hässlich, aber funktioniert!
quelle
Dies kann auf jede Klasse erweitert werden, die dem UIAppearance-Protokoll entspricht - nicht nur auf UIViews. Hier ist eine allgemeinere Version:
UIAPerance + Swift.h
UIAPerance + Swift.m
quelle
Ich habe ein Repo für euch erstellt, die Folgendes verwenden möchten
CocoaPods
:Fügen Sie dies in Ihre
Podfile
:Import in deine Klasse:
Referenz: https://github.com/levantAJ/UIViewAppearanceSwift
quelle
Swift 4: iOS 9+
quelle
Es scheint, dass Swift (zumindest ab Beta5) es aus mir unbekannten Gründen nicht unterstützen kann. Vielleicht ist die erforderliche Sprachfunktion noch in Bearbeitung, da ich nur davon ausgehen kann, dass sie aus gutem Grund aus der Benutzeroberfläche herausgelassen wurde. Wie Sie sagten, ist es laut den Dokumenten immer noch in ObjC verfügbar. Wirklich enttäuschend.
quelle
appearanceWhenContainedIn:
immer noch vom Tisch.Sie können dies verwenden:
Bearbeiten: AussehenWennContainedIn in Swift entfernt wurde. Diese Antwort war für die Beta 5, um das Erscheinungsbild des Textes aller Balkenschaltflächen zu ändern.
quelle
UIControlState.Normal
Sie nicht einfach.Normal
Swift verwenden , sondern kennen den Typ durch Inferenz.appearanceWhenContainedIn
wurde entfernt.Sie sollten in der Lage sein, die
Objective-C
Syntax einfach inSwift
Syntax zu übersetzen.In Kürze sollten die Methoden wie folgt deklariert werden:
Sie können dies also versuchen:
Ich muss noch herausfinden, ob dies der saubere Weg ist, eine Klassenmethode aufzurufen
Swift
.Hoffe das hilft,
quelle
UIAppearance
Protokolldokumentation ansehen (dieUIBarButtonItem
entspricht), existiert die Methode `ErscheinungsbildWhenContainedIn (_ :) (sie ist nur noch nicht in Swift implementiert): developer.apple .com / Bibliothek / Vorabversion / ios / Dokumentation / UIKit /…