2009-05-18 9 views
0

Offenbar habe ich mit Bindings zu lange gearbeitet, weil ich nicht herausfinden kann, wie das geht. Ich habe einen Tisch mit mehreren Spalten. Wenn eine Zeile ausgewählt ist, können Sie ihre Priorität bearbeiten, wodurch ein Kerndatenattribut geändert wird. Ich habe dies auch als IBAction festgelegt. Grundsätzlich möchte ich auf den Wert des Core Data Attributs von meinem Code zugreifen. Dann möchte ich die erste Spalte der ausgewählten Zeile (und hatte ihre Priorität geändert) auf eine Anzahl von Ausrufezeichen setzen, die der Prioritätsebene entsprechen.Zelle in ausgewählter Zeile bearbeiten

Entschuldigung das ist verwirrend formuliert; Hier ein Beispiel:

Zeile 7 ist ausgewählt. Ich ändere seine Priorität auf 2. Jetzt ist das Core Data-Attribut myPriority auf 2 gesetzt. Ein Codeblock wird jetzt ausgelöst. Es erhält die Priorität der ausgewählten Zeile (Zeile 7) von Core Data und möchte Spalte 1 der ausgewählten Zeile (Zeile 7) auf 2 Ausrufezeichen (Priorität 2) setzen.

Danke!

Antwort

1

Wenn Sie Bindungen gewöhnt sind, dann würde ich empfehlen, bei NSValueTransformer suchen; Insbesondere wird eine Unterklasse von dem erstellt, die einen Prioritätswert in eine Ausrufezeichenkette konvertiert. Sie geben dann einfach den Namen (der in +setValueTransformer:forName: verwendet wird) als Attribut "Werttransformer" in Ihren Bindungen an.

Zum Beispiel würde der Code wie so aussehen:

@interface PriorityTransformer : NSValueTransformer 
@end 

@implementation PriorityTransformer 
+ (Class) transformedValueClass { return ([NSString class]); } 
+ (BOOL) allowsReverseTransformation { return (NO); } 
- (id) transformedValue: (id) value 
{ 
    // this makes the string creation a bit simpler 
    static unichar chars[MAX_PRIORITY_VALUE] = { 0 }; 
    if (chars[0] == 0) 
    { 
     // ideally you'd use a spinlock or such to ensure it's setup before 
     // another thread uses it 
     int i; 
     for (i = 0; i < MAX_PRIORITY_VALUE; i++) 
      chars[i] = (unichar) '!'; 
    } 

    return ([NSString stringWithCharacters: chars 
            length: [value unsignedIntegerValue]]); 
} 
@end 

Sie dann diesen Code in die gleiche Datei als zentrale Klasse (wie die Anwendung delegiert) setzen würden und registrieren sie durch diese +initialize Methode der Klasse um sicherzustellen, dass es in der Zeit für alle nibs registriert ist es zu finden:

+ (void) initialize 
{ 
    // +initialize is called for each class in a hierarchy, so always 
    // make sure you're being called for your *own* class, not some sub- or 
    // super-class which doesn't have its own implementation of this method 
    if (self != [MyClass class]) 
     return; 

    PriorityTransformer * obj = [[PriorityTransformer alloc] init]; 
    [NSValueTransformer setValueTransformer: obj forName: @"PriorityTransformer"]; 
    [obj release]; // obj is retained by the transformer lookup table 
} 
Verwandte Themen