2012-04-04 4 views
0

Gibt es eine Alternative wie tag zu Eigentum von UIView zu verwenden? Die Sache ist, ich würde gerne UITextField einige NSInteger übergeben. Möglichkeit zu tun ist tag. Aber ich möchte 2 verschiedene NSInteger passieren.Alternative/Ähnlich zum Tag in UIView

Irgendwelche Ideen?

Antwort

3

Sie könnten UITextField ableiten und der Klasse zwei NSInteger-Eigenschaften hinzufügen.

@interface CustomTextField : UITextField 

@property (nonatomic, assign) NSInteger x; 
@property (nonatomic, assign) NSInteger y; 

@end 
+0

+1 Ich wollte das gleiche sagen. :) – lnafziger

2

Sie können alle Daten auf jedes Objekt anhängen ein Associative Reference verwenden. Dies ist ein sehr praktischer Ansatz. Es behandelt sogar die Speicherverwaltung korrekt. Ich verwende manchmal eine Kategorie, um diese zu umbrechen, damit ich neue Eigenschaften für eine vorhandene Klasse erstellen kann. Zum Beispiel möchte ich in einem Projekt, dass jeder View-Controller etwas über ein spezielles Label weiß (wie sie alle über navigationController wissen). Ich mache es so:

@interface UIViewController (MYSpecialViewController) 
@property (nonatomic, readwrite, strong) UILabel *specialLabel; 
@end 

@implementation UIViewController (MYSpecialViewController) 
static const char kMySpecialLabelKey; 

- (UILabel *)specialLabel 
{ 
    return objc_getAssociatedObject(self, &kMySpecialLabelKey); 
} 

- (void)setSpecialabel:(UILabel *)value 
{ 
    objc_setAssociatedObject(self, &kMySpecialLabelKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
@end 

Sie können ein einfaches Arbeitsbeispiel finden ein UIAlertView im iOS5 mit: PTL Beispielcode für Chapter 3.

+0

Ich habe ein paar kleine Änderungen gemacht, ich hoffe es stört dich nicht. Zuvor hätte es den statischen Zeigerwert verwendet, der 0 wäre. Jetzt ist es ein Zeiger auf ein statisches Zeichen, das eine sinnvolle Adresse haben wird. –

+0

@SedateAlien Danke. Du hast vollkommen recht. Dies war ein Fehler im Code, auf den ich hingewiesen habe (also habe ich jetzt meinen Produktcode korrigiert). Der referenzierte Beispielcode führt es korrekt aus. Wie Sie bemerken, sollte dies ein Char, kein Char * sein. –

+0

Was ist der Vorteil dieses -vs-Unterklassenbildung? – lnafziger

1

Nehmen Sie die allgemeine objektorientierte Lösung, aber erinnern Sie sich ein Material sehr viele Daten in einem Tag kann:

- (uint32_t)pack:(uint16_t)a with:(uint16_t)b { 

    return (uint32_t)(a << 16 | b); 
} 

- (uint16_t)getA:(uint32_t)pair { 
    return (uint16_t)((pair & 0xffff0000) >> 16); 
} 

- (uint16_t)getB:(uint32_t)pair { 
    return (uint16_t)(pair & 0xffff); 
} 

// use it 

- (void)setupSomeView { 

    someView.tag = [self pack:1024 with:2048]; 
} 

- (IBAction)someControlEventHappened:(id)sender { 

    NSLog(@"%d %d", [self getA:sender.tag], [self getB:sender.tag]); 
} 

Caveats:

  1. @ RobNapier Antwort ist allgemeiner, korrektere . Der einzige Vorteil diese Art und Weise ist, dass es schnell und schmutzig
  2. Works für Paare von unsigned ints < 32k
  3. Works NSInteger Implementierungen> = 32 Bits, die überall ist, glaube ich.