2010-05-30 18 views
52

Ustawiłem jeden z moich podstawowych atrybutów danych jako logiczny. Teraz muszę ustawić, ale XCode mówi mi, że może nie odpowiadać na setUseGPS.iPhone: Zapisz boolean w danych podstawowych

[ride setUseGPS: useGPS.on]; 

Jaka jest metoda ustawiania wartości logicznej w danych podstawowych? Wszystkie moje inne cechy są ustawione w ten sposób i działają świetnie. Więc nie wiesz, dlaczego boolean nie działa tak, aby ustawić?

+0

Wyjazd NSNumber –

Odpowiedz

131

Dane podstawowe "nie ma" typu Boolean (ma, ale jest NSNumber).

Aby ustawić ekwiwalent useGPS = YES.

[entity setUseGPS:[NSNumber numberWithBool:YES]]; 

I na odwrót:

BOOL isGPSOn = [[entity useGPS] boolValue]; 

Aktualizacja: Jak podkreślił SKG, z literałów w Objetive-C można teraz zrobić w prostszy sposób:

[entity setUseGPS:@YES]; 

BOOL isGPSOn = entity.useGPS.boolValue; 
+9

Można ustawić wartości... podobnie jak to: 'object.isGPSOn = @YES;' – guptron

+0

Wygląda na to, że faktycznie widzę typ Boolean w menu rozwijanym podczas tworzenia nowego atrybutu w edytorze danych podstawowych. Co z tego? –

0

"Poprawka" tego (IMHO, to błąd w SDK Apple'a) polega na dodaniu następującego kodu do wygenerowanej przez CoreData klasy. Uwaga: jeśli robisz to w kategorii, w osobnym pliku, wtedy nie ma potrzeby ponownego kopiuj/wklej go za każdym razem, gdy zregenerować klas CoreData wewnątrz Xcode

- (BOOL)useGPS 
{ 
    [self willAccessValueForKey:@"useGPS"]; 
    BOOL myuseGPS = [[self primitiveUseGPS] boolValue]; 
    [self didAccessValueForKey:@"useGPS"]; 
    return myuseGPS; 
} 

- (void)setUseGPS:(BOOL)newValue 
{ 
    [self willChangeValueForKey:@"useGPS"]; 
    [self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]]; 
    [self didChangeValueForKey:@"useGPS"]; 
} 
+0

Prowadzi to do konfliktów typów podczas kompilacji. Czy powinienem zmieniać typy istniejących właściwości NSNumber? –

+0

@Daniel Wood - nie zmieniaj istniejących typów: CoreData wymaga, aby były NSNumber. ostrzeżenia dotyczące kompilacji są irytujące - łatwym rozwiązaniem jest zmiana nazwy powyższych dwóch metod na "używanie GPSAsBool" i "setUseGPSAsBool". Uwaga: nadal możesz uzyskać dostęp do nieruchomości, tylko teraz nazywa się ją "GPSAsBool", np. "if (myCoreDataObject.GPSAsBool)" – Adam

+0

Po przeczytaniu poniższych dokumentów zdecydowałem, że nie będę się tym przejmował i po prostu konwertuję z NSNumber w moim kodzie: "Zalety umożliwienia Core Data zarządzania własnym magazynem zwykle przewyższają wszelkie zalety interakcji bezpośrednio z wartościami skalarnymi "http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html –

18

Jako alternatywne podejście do Akceptowane odpowiedź, można po prostu zmienić wpisując z NSNumber * do bool w zarządzanym ubterfejsu obiektów, takich jak:

@property (nonatomic) BOOL useGPS; // Notice that the 'retain' is also removed as we're now dealing with a scalar rather than an NSObject 

różne alternatywne podejścia są omówione here, ale Chris Hanson „s odpowiedź była najbardziej pouczające dla mnie , w szczególności:

Jeśli masz atrybut numeryczny (włączając atrybut Boolean), który jest wymagane, wystarczy wpisać go jako skalara zamiast i Core danych zrobi uszne:

@property (nonatomic) BOOL isDone;

Nawet jeśli atrybut jest opcjonalny, , który będzie nadal działał - będzie po prostu połączyć "nieobecny" z "fałszem".

i bardziej wyrównany realizacji kakao:

Jedną rzeczą może chcesz zrobić to nazwać właściwość „Gotowe” i po prostu określić jako getter „isDone”. To jest zwykła konwencja nazewnictwa Cocoa:

@property (nonatomic, getter = isDone) BOOL done;

Następnie można wpisać "if (item.done) { ...}" lub "element.zrobione = NO;”i kompilator wygeneruje -isDone dla dostępów majątku

Dzięki Chris i mam nadzieję, że to pomoże komuś

+1

Podczas próby wykonania tej metody widzę awarię systemu iOS 4.x. Oto komunikat: "pasek właściwości" jest typem skalarnym w klasie "Foo" .Nie można wygenerować dla niego metody pobierającej. " Próbowałem ustawić typ atrybutu na Boolean w modelu Core Data, a także wypróbowałem Integer 16. I tak samo mam tę awarię. Czy czegoś brakuje? Być może wrócę do używania NSNumber. –

+2

O ile mi wiadomo, nie działa to w podklasach NSManagedObject. – teh1

Powiązane problemy