2014-04-25 13 views
26

mam błędzie NSInvalidArgumentException to moja klasa modeluNSInvalidArgumentException 'REAS - [__ NSPlaceholderDictionary initWithObjects: znalezienia kluczy: Ilość:]: wkładać do nil obiekt od obiektów [4]'

+(NSArray *)users 
{ 
    NSDictionary *user1 = @{@"username" : @"master photographer", @"email" : @"[email protected]", @"password" : @"drowssap", @"age" : @24, @"profilePicture" : [UIImage imageNamed:@"person1.jpeg"]}; 
    NSDictionary *user2 = @{@"username" : @"Lots of tots", @"email" : @"[email protected]", @"password" : @"icecreamrocks", @"age" : @65, @"profilePicture" : [UIImage imageNamed:@"person2.jpeg"]}; 
    NSDictionary *user3 = @{@"username" : @"iTechie", @"email" : @"[email protected]", @"password" : @"infiniteloop", @"age" : @30, @"profilePicture" : [UIImage imageNamed:@"person3.jpeg"]}; 
    NSDictionary *user4 = @{@"username" : @"Royal", @"email" : @"[email protected]", @"password" : @"IGotAPalace", @"age" : @0, @"profilePicture" : [UIImage imageNamed:@"person4.jpeg"]}; 

    NSArray *userArray = @[user1, user2, user3, user4]; 
    return userArray; 
} 

@end 

i to jest mój viewDidLoad

self.users = [DMZUserData users]; 
NSLog(@"%@", self.users); 
+6

Jeden (lub więcej) z Twoich obrazów nie istnieje, co powoduje 'nil'. – rmaddy

+0

Myślę, że komunikat o błędzie informuje, co jest nie tak. * Cokolwiek * na tej liście wartości słownika, które potencjalnie mogą być 'nil' ** wynosi **' nil'. Zrób trochę debugowania i znajdź to sam. – trojanfoe

+1

Masz pytanie? – matt

Odpowiedz

26

Błąd oznacza, że ​​próbujesz umieścić nil w słowniku (co nie jest dozwolone). Ponieważ budujesz słowniki za pomocą literałów łańcuchowych, nie mogą one być nil. Oznacza to, że problem dotyczy jednego lub więcej obrazów.

Spróbuj tego, aby pomóc znaleźć problem:

+(NSArray *)users 
{ 
    UIImage *image1 = [UIImage imageNamed:@"person1.jpeg"]; 
    UIImage *image2 = [UIImage imageNamed:@"person2.jpeg"]; 
    UIImage *image3 = [UIImage imageNamed:@"person3.jpeg"]; 
    UIImage *image4 = [UIImage imageNamed:@"person4.jpeg"]; 

    NSDictionary *user1 = @{@"username" : @"master photographer", @"email" : @"[email protected]", @"password" : @"drowssap", @"age" : @24, @"profilePicture" : image1 }; 
    NSDictionary *user2 = @{@"username" : @"Lots of tots", @"email" : @"[email protected]", @"password" : @"icecreamrocks", @"age" : @65, @"profilePicture" : image2 }; 
    NSDictionary *user3 = @{@"username" : @"iTechie", @"email" : @"[email protected]", @"password" : @"infiniteloop", @"age" : @30, @"profilePicture" : image3 }; 
    NSDictionary *user4 = @{@"username" : @"Royal", @"email" : @"[email protected]", @"password" : @"IGotAPalace", @"age" : @0, @"profilePicture" : image4 }; 

    NSArray *userArray = @[user1, user2, user3, user4]; 
    return userArray; 
} 

Teraz można użyć debuggera i zobaczyć, czy image1, image2, image3 lub image4 jest nil lub dodać NSLog oświadczenia dla każdego.

Należy pamiętać, że w nazwach plików rozróżniana jest wielkość liter, dlatego należy się upewnić, że nazwa przekazana do nazwy imageNamed: dokładnie pasuje do prawdziwej nazwy pliku. Sprawdź również, czy obrazy mają rozszerzenie jpeg, a nie jpg. Upewnij się, że obrazy są pakowane w pakiet zasobów.

+1

Warto również zauważyć, że jeśli używany jest katalog zasobów Xcode, rozszerzenie powinno zostać pominięte. Ponieważ obrazy są w formacie JPEG, najprawdopodobniej tak nie jest, ale nadal należy o nich wspomnieć. –

1

Oznacza to, że jedna z wartości, które próbujesz umieścić w tym słowniku, to zero, najprawdopodobniej jedno ze zdjęć. Możesz spróbować przypisać obrazy do zmiennych i sprawdzić je, aby zobaczyć, czy tak jest.

4

Jedna z UIImages, które próbujesz utworzyć, jest zerowa. należy dodać następujący kod w pierwszym wierszu metody + użytkownicy (NSArray *)

NSAssert([UIImage imageNamed:@"person1.jpeg"] != nil, @"Person 1 image does not exist"); 
NSAssert([UIImage imageNamed:@"person2.jpeg"] != nil, @"Person 2 image does not exist"); 
NSAssert([UIImage imageNamed:@"person3.jpeg"] != nil, @"Person 3 image does not exist"); 
NSAssert([UIImage imageNamed:@"person4.jpeg"] != nil, @"Person 4 image does not exist"); 

To fragment kodu drukuje na konsoli, co z obrazów nie istnieje. Uruchom proszę na DEBUGU i zobaczmy, jaki jest wynik tych twierdzeń.

Mam nadzieję, że to pomoże!

2

Lepiej leczyć prawdopodobnie jest, aby „NSDictionary” tak:

NSDictionary *user1 = [NSDictionary dictionaryWithObjectsAndKeys: my obj & key here, nil]; 
+0

Jak to jest lepsze lekarstwo? –

+0

prostu dlatego ta metoda: + (id) dictionaryWithObjectsAndKeys: (id) firstObject ... powrót wyjątek dla klucza nil ... istead: - (id) initWithDictionary: (NSDictionary *) słowniku copyItems: (BOOL) flag (Wydaje mi się, że ta metoda jest tutaj przywołana) ... która wydaje się nie zwracać nic na temat zerowych kluczy – Mike97

2

próba wstawienia nil obiekt z obiektów [4]” oznacza, że ​​albo klucza lub wartości w indeksie [4] jest zerowe.

Tak jak inni powiedzieli, byłby to jeden z twoich obrazów, ponieważ klucz w indeksie [4] jest literałem ciąg.

Powiązane problemy