UIAppearance proxy für benutzerdefinierte Objekte
Habe ich ein benutzerdefiniertes Objekt, es erbt von NSObject.
Dieses Objekt muss "einige Sachen", eine davon ist die Schaffung einer UIView mit einigen UIKit Gegenstände (UILabel, UIButtons ecc ecc...).
Dieses Objekt hat einige Eigenschaften wie: Textfarbe, schriftart, Hintergrundfarbe..., die verwendet werden, um das Aussehen der enthaltenen UIKit Gegenstände.
Möchte ich anpassen, diese Eigenschaften von "one shot" für alle erstellten Instanzen dieses Objekts, und ich habe die UIAppearance Protokoll.
Standard-UIKit-Objekte entspricht den bereits UIAppearance Protokoll, aber ich weiß nicht, der Stil angewendet werden soll auf ALLE UILabels oder UIButtons. Ich möchte zum anwenden von Stilen nur auf das UILabels und UIButtons enthalten in meinem Objekt-Instanzen.
Außerdem kann ich nicht (und will ich nicht) verwenden appearanceWhenContainedIn: weil der Entwickler mit dem benutzerdefinierten Objekt kann nicht wissen, welche Art von Objekten sind "enthalten" drin.
So, ich war auf der Suche, wie man meine eigene Objekt entspricht UIAppearance Protokoll.
AFAIK muss es implementieren, die
+ (id)appearance
Methode. Diese Methode zurückgeben soll ein proxy-Objekt, wo können Sie senden Sie alle Ihre Anpassungen.
Aber mit Blick auf die Darstellung der Methode der UIKit Gegenstände, die ich sehe, dass ein privat-Objekt zurückgegeben.
Ein Objekt der Klasse _UIAppearance.
So, scheint es, dass Apple doesn T geben mir ein standard-proxy-Objekt für customizing meine eigenen, und ich habe zu erstellen, wenn von Grund auf.
Ist das richtig, oder bin ich etwas zu verlieren?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach einigen Forschung ich "aufgeben" über die Verwendung einer standard-Apple-Objekt. Es nicht vorhanden ist, für jetzt. Ich habe meinen eigenen proxy, es ist ganz einfach (funktioniert nur mit "Aussehen:" von jetzt).
Lassen Sie uns erklären Sie.
Ich möchte festlegen, das Erscheinungsbild der "Textfarbe" auf ein NSObject Unterklasse, nennen wir es mal "FLObject".
Machen FLObject entspricht UIAppearance Protokoll und überschreiben Sie die Methode Aussehen.
In dieser Methode sollten Sie wieder eine proxy-Klasse (die ich erstellt):
Wie es funktioniert?
FLAppearance erstellt eine einzelne Instanz von sich selbst, für jede Klasse übergeben, die von der appearanceForClass: Methode.
Wenn rufen Sie es zwei mal für die gleiche Klasse, die gleiche Instanz zurückgegeben.
Dann können Sie etwas wie das hier tun:
FLAppearance überschreibt die forwardInvocation: Methode, so dass es akzeptiert alle Methoden gesendet.
Dann, es setzt alle Aufrufe in einem array.
Wenn FLObject initialisiert wird, ein einfacher Aufruf
beginnt zu senden, Anrufungen und legen Sie die Anzeige.
Sicher, das braucht etwas tuning und Fehler überprüfen, aber ich denke, es ist ein guter Anfang.
instancetype
stattid
als Rückgabe-Typ, so dass Sie können auch überspringen Sie die explizite Umwandlung zuFLAppearance
.Für die Zwecke der mein eigenes Projekt, ich sammle alles zusammen und veröffentlicht benutzerdefinierte UIApperance proxy als open-source-Projekt MZApperance
Schöne Umsetzung, die ich leicht modifiziert den code und erstellt die Klasse als eine Unterklasse von
NSProxy
. Verwenden Sie es in einem Projekt fand ich ein memory-leak:Beispiel: mit dem proxy, in der Globale Einstellungen/Aussehen, jede Instanz dieser Klasse nie erreichen wird refCount auf 0, so dass
dealloc
wird nie aufgerufen werden.Leck-code:
Update:
Kategorie kopieren für NSInvocation
Check-out http://logicalthought.co/blog/2012/10/8/uiappearance-and-custom-views
Im Grunde brauchen Sie nur tag Ihre Eigenschaften mit
UI_APPEARANCE_SELECTOR
und alles funktioniert so lange, wie Sie Ihre Klasse ist eine Unterklasse vonUIView
wird, behandeln die aktuellen Automaten der privaten_UIAppearance
Klasse.Edit:
Sind Sie wahrscheinlich besser dran, nur Rollen Sie Ihre eigene Lösung mit einer singleton-und einige Klassen-Methoden eher als Versuch zu tun, etwas unheimlich mit der Laufzeit. Es sieht nicht wie
UIAppearance
unterstützt Ihren Anwendungsfall.Auf der anderen Seite, könnten Sie kleben jedes Objekt, das Sie verkaufen in einer privaten
UIView
Unterklasse und dann vend Instanzen dieser Unterklasse statt. Dann kann man nach vorne Auftritt-Nachrichten an IhreNSObject
auf die instances, die Sie verkaufen, und verwenden SieappearanceWhenContainedIn:<your private subclass>
. Das könnte chaotisch und zwar verwirrend sein könnte für die Verbraucher der Klasse.