2012-11-02 4 views
33

Ich habe ein paar Fragen über Stack-Überlauf über Unterklasse UIButton gestellt, und ein paar Leute haben mich informiert, dass ich keine UIButton Unterklasse werden sollte.Warum sollte ich eine UIButton nicht ableiten?

Was sind die Nachteile der Unterklassen a UIButton? Und ich weiß, es ist vage, aber was sind andere Alternativen zur Unterklasse UIButton?

+1

Was ist der Grund für die Unterklasse eines UIButton? Geben Sie den Knopftyp "benutzerdefiniert" an. Was braucht es noch? –

+0

Ich fragte mehr nur, wenn ich in der Zukunft Unterklasse werden möchte, warum ich es nicht tun sollte. Aber im Moment werde ich ungefähr 20 Knöpfe in meiner App haben, die den gleichen Hintergrund, die gleiche Schriftart, die gleiche Füllhöhe haben. Also wollte ich gleich etwas Zeit und Code durch Unterklassen erstellen. – KKendall

+2

Es gibt keinen Grund, warum Sie UIButton nicht ableiten können. Tatsächlich mache ich es, damit ich IB verwenden kann, um das Aussehen meines Knopfes zu definieren. Warum? Designflexibilität Viele Menschen haben UIButton subclassiert. Ich habe UIButton subclassiert. Dieser Glaube, den es nicht kann, wiederholt sich, aber es fehlt ihm der Beweis. –

Antwort

35

Die Cocoa-Frameworks verwenden den Ansatz, dass das Object Composition-Muster geeigneter ist als die traditionelle Klassenhierarchie.

Im Allgemeinen bedeutet dies, dass es wahrscheinlich eine Eigenschaft in UIButton gibt, in der Sie ein anderes Objekt für die verschiedenen Aspekte der Schaltfläche festlegen können. Dies ist die bevorzugte Methode, um die Funktionsweise Ihrer Schaltfläche anzupassen.

Einer der Hauptgründe für dieses Muster ist, dass viele Bibliothekskomponenten Schaltflächen erstellen und nicht wissen, dass sie Instanzen Ihrer Unterklasse erstellen sollen.

bearbeiten, Ihre eigene Factory-Methode

bemerkte ich Ihren Kommentar oben über Zeit zu sparen, wenn Sie die gleiche Taste Config über viele Tasten in Ihrer Anwendung haben. Dies ist ein guter Zeitpunkt, um das Factory Method-Designmuster zu verwenden, und in Objective-C können Sie implement it with a Category, so dass es direkt auf UIButton verfügbar ist.

@interface UIButton (MyCompanyFactory) 
+(UIButton *) buttonWithMyCompanyStyles; 
@end 
@implementation UIButton 
+(UIButton *) buttonWithMyCompanyStyles { 
    UIButton *theButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    // [theButton set... 
    return theButton; 
} 
@end 
+0

obwohl wichtig zu entwerfen, ich bin mir nicht sicher, "favor composition" ist wirklich eine gute Antwort auf die Frage, weil "UIButton" in dieser Hinsicht eigentlich eigenwillig ist. Ich werde sicherlich nicht downvote, weil Ihr Beitrag gute Punkte macht (in der Tat, ich upvoted). – justin

+0

@justin, ich bin immer für eine gute Konversation! Bloggen Sie irgendwo, oder haben Sie einen Link zu einer verwandten Diskussion irgendwo? –

+3

Ich habe einen Link von Cocoa-Dev Listen in meiner Antwort zu diesem Thema hinzugefügt. Wenn Sie mich erreichen möchten, können Sie mich gerne privat oder öffentlich über Twitter informieren (handle in meinem SO-Profil). Ich blogge nicht - SO ist mein primärer Kodierungswasserkühler. Ich halte mich zurück. – justin

15

Es ist, weil UIButton Art besondere ist, dass es gibt ein paar Komplexitäten/Feinheiten/Einschränkungen (das heißt zusätzliche Überschreibungen für Sie zu definieren, insbesondere +buttonWithType:) erforderlich, um für sie wie erwartet funktionieren. Es ist mehr als die üblichen -initWithFrame: (und -initWithCoder:, wenn in XIBs verwendet). IDK, warum die Framework-Autoren diese Details in unsere Domain eindringen ließen, aber das muss jetzt von uns erledigt werden. Die Einschränkung besteht darin, dass Ihre Implementierung nicht von voreingestellten Systemschaltflächenstilen abhängen (d. H. Erweitern) sollte. Sie müssen UIButtonTypeCustom als Ausgangspunkt für eine Unterklasse UIButton annehmen.


On implementing a subclass of UIButton

10

Wenn Sie etwas leichter mit Ihrem eigenen ‚Subviews‘ nur suchen, sollten Sie stattdessen Subklassen UIControl werden. UIButton Unterklassen UIControl und Ereignisse behandeln, wie:

[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside]; 

UIControl Subklassen UIView so können Sie sauber layoutSubviews auf alle Ansichten von Ihrem UIControl Unterklasse enthalten und unnötige Ansichten vermeiden, die mit UIButton kommen. Im Wesentlichen erstellen Sie nur Ihr eigenes "UIButton", aber Sie vermeiden es, Verhalten und Funktionalität zu umgehen, die Sie nicht wirklich wollen oder brauchen.