2 Stimmen

Kann ich ein benutzerdefiniertes Objekt innerhalb einer Schaltfläche in Objective-C speichern?

In Winforms/C# haben die meisten alle UI-Steuerelemente ein .Tag-Tag, so wie myButton.Tag = myObject; wo die Tag-Eigenschaft ist ein "Objekt" Typ, so dass Sie im Grunde jede Art von Objekt speichern können. Wie könnte ich dies in Objective-C/Cocoa erreichen? haben alle UI-Elemente etwas wie .Tag, wo ich ein NSObject oder etwas speichern kann? Wenn ja, können Sie bitte ein Beispiel geben. Herzlichen Dank!

Anmerkung: Ich habe dort die Ganzzahl .Tag gesehen, aber ich wollte ein Objekt-Tag. Aber ich denke, das gibt es nicht. na ja.

0 Stimmen

Was macht das Objekt? Dies kann bei der Entscheidung helfen, ob es eine geeignetere Lösung gibt als den Versuch, es mit einem Steuerelement der Benutzeroberfläche zu verknüpfen.

0 Stimmen

Ich möchte, dass die Schaltfläche einen Wert und einen Bezeichner haben. Wenn ich .Tag als Bezeichner verwende, werde ich nicht in der Lage sein, einen Wert darauf zu speichern. Im Grunde, ich brauche nur mehr Informationen in der Schaltfläche zu speichern.

2 Stimmen

Eine Schaltfläche sollte keinen Wert haben; ihr Zweck ist es, eine Aktion aufzurufen, und nicht, beliebige Daten zu speichern.

5voto

Yuji Punkte 33823

Wie Georg schon sagte, können Sie mit der Objective-C-Laufzeitumgebung jedes beliebige Objekt mit einem anderen Objekt verknüpfen, also können Sie ein Objekt mit einem Steuerelement verknüpfen, wenn Sie das wirklich wollen.

Aber so funktioniert ein Standard-Cocoa-Programm nicht wirklich. Stattdessen sind in Cocoa das Model-View-Controller-Muster und die Delegation das Standard-Idiom, und es wird davon abgeraten, ein Objekt direkt mit einem Widget oder einer Ansicht zu verknüpfen. Selbst für ein sehr kleines Programm würden Sie zumindest einen Model-Controller erstellen (normalerweise als Antragsdelegierter im Cocoa-Jargon), die die Daten verwaltet, und lassen Sie die Ansicht, die aus den Standardsteuerelementen besteht, wie sie ist. Dann interagieren der View und der Model-Controller über Target/Action und Delegation.

Apple hat eine sehr schöne Diskussion über die in Cocoa vorherrschenden Entwurfsmuster, siehe aquí .

Wenn man von einer API (Winforms/C#) zu einer anderen API (Cocoa/Objective-C) wechselt, gibt es im Allgemeinen einige Ähnlichkeiten, aber auch einige Unterschiede. In der Regel lohnt es sich, zu lernen, wie die Dinge in dieser API ablaufen, anstatt zu versuchen, das Gewohnte in eine neue Situation zu zwängen. (Nur um das klarzustellen: Ich sage nicht, welche API von Natur aus besser ist; diese Diskussion geht in beide Richtungen!)

Wenn Sie sich also in einer Situation befinden:

Zu tun X in API A Ich kenne die Redewendung P funktioniert. Ich möchte nun Folgendes tun X in API B . Wie kann ich Idiom direkt implementieren P in API B ?

Ich empfehle Ihnen zu fragen

Zu tun X in API B Was soll ich tun? Was ist das Idiom in API B ?

stattdessen.

2voto

Robert Christie Punkte 19309

NSControl hat eine Tag und verwandte setTag: Methode. Sie wird intern nicht verwendet, so dass Sie in ihr speichern können, was immer Sie wollen - sie speichert allerdings nur NSInteger-Werte.

Alle Cocoa-Steuerelemente erben von NSControl.

1voto

Georg Schölly Punkte 120083

Es besteht die Möglichkeit, eine Kennzeichnung hinzuzufügen, die, wenn ich mich recht erinnere, eine ganze Zahl ist.

Allerdings bin ich mir ziemlich sicher, dass man diese Funktionalität in Cocoa nie braucht, weil es einfach nicht so funktioniert.

Wenn Sie wirklich Informationen hinzufügen möchten, könnten Sie an der Fähigkeit der Laufzeitumgebung interessiert sein ein Objekt mit einem anderen Objekt zu verknüpfen .

1voto

rpetrich Punkte 32030

CALayer s haben die Möglichkeit, beliebige Schlüssel als Teil ihrer Schlüssel-Wert-Kodierungsmaschinerie zu speichern. Beispiel:

CALayer *myLayer = [button layer];
// Storing a value
[layer setValue:@"World!" forKey:@"hello"];
// Retrieving a value
NSLog(@"Hello %@", [layer valueForKey:@"hello"]);

Davon abgesehen verstößt die Speicherung von Objekten gegen Elemente der Benutzeroberfläche gegen das Prinzip des Model-View-Controller-Musters; ich würde davon abraten - eine UIView o UIControl Unterklasse wäre wahrscheinlich besser geeignet.

1voto

Clive Paterson Punkte 1543

Yep. Sie können Ihre eigene Eigenschaft zu allen UIControls hinzufügen, wenn Sie möchten. Fügen Sie einfach das Folgende zu Ihrem Code hinzu.

#import <objc/runtime.h>

/* -------- The Following Code adds an objectData property for every UIControl ----------- */
@interface UIControl (UIControlAdditions)
@property (nonatomic, retain) id objectData;
@end

static char const * const ObjectDataKey = "MyObjectDataKey";

@implementation UIControl (UIControlAdditions)
@dynamic objectData;
-(id)objectData {
    return objc_getAssociatedObject(self,ObjectDataKey);
}
- (void)setObjectData:(id)newObjectData {
    objc_setAssociatedObject(self, ObjectDataKey, newObjectData, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
/* -------- The Above Code adds an objectData property for every UIControl ----------- */

Dank an Ole Begemann: http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X