2016-04-11 7 views
-1

Ich benutze die Google Places API, um nach Restaurants in der Nähe zu suchen. Jedes Restaurant wird in einer Zelle in einer UITableView angezeigt. Die Antwortantwort ist im JSON-Format. Von den Dingen, die der JSON enthält, ist eine Dezimalzahl, die die Bewertung des Restaurants darstellt. Ich möchte die Bewertung in den Zellen anzeigen. Allerdings gibt es manchmal keine Bewertung für das Restaurant und der Wert ist (null). Daher habe ich in der cellForRowAtIndexPath-Methode eine Überprüfung hinzugefügt, die überprüft, ob der Wert der Bewertung null ist oder nicht.Tableview stürzt ab, wenn JSON null zurückgibt. Ios

if([dict valueForKey:kResponseRating] != [NSNull null]) 
{ 
    NSNumber *rating = [dict valueForKey:kResponseRating]; 
    [cell displayRating:rating]; 
} 
else 
{ 
    NSLog(@"Value of rating is null"); 
} 

Wenn ich die Anwendung laufen noch die Tableview so schnell abstürzt als ein Nullwert zurückgegeben wird und die Zeichenfolge „Wert der Bewertung ist null“ wird nicht gedruckt. Es geht also nicht in die else-Anweisung, auch wenn der Wert in json null ist.

Ok, also habe ich überprüft, ob der Rückgabewert vom Typ NSString Klasse und nicht ist. Hier ist, was ich in der gleichen Methode gemacht habe:

if([[dict objectForKey:kResponseRating] isKindOfClass:[NSString class]]) 
{ 
    NSLog(@"The return response is of type NSString"); 
} 

Und es ging nicht in if-Anweisung.

Hier ist die Methode, die die Bewertung berechnet und bucht. Das Verfahren nimmt die Runden auf die nächstfolgende 0,5 und dann zeigt es als Sterne von 5.

-(void)displayRating:(NSNumber*)rating{ 

double rate = [rating doubleValue]; 


rate = round(rate * 2.0)/2.0; 


int counter = 0; 
double compareVar = 1.0; 

while(counter <= 4){ 

    if(rate == 0.0) 
    { 
     imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starempty.png"]]; 
     [self.contentView addSubview:imgRating[counter]]; 
    } 
    else 
    { 

    if(compareVar < rate) 
    { 
     imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starfill.png"]]; 
     [self.contentView addSubview:imgRating[counter]]; 
    } 
    else if(compareVar == rate) 
    { 
     imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starfill.png"]]; 
     [self.contentView addSubview:imgRating[counter]]; 
    } 
    else 
    { 
     if(compareVar - rate == 0.5) 
     { 
      imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starhalffill.png"]]; 
      [self.contentView addSubview:imgRating[counter]]; 
     } 
     else 
     { 
      imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starempty.png"]]; 
      [self.contentView addSubview:imgRating[counter]]; 
     } 

    } 

    counter++; 
    compareVar = compareVar + 1.0; 

    } 
} 

    NSLog(@"This is rate: %f", rate); 
} 

Ist eine Codezeile in diesem Verfahren einen Absturz verursacht?

+0

dass, wenn sonst Bedingung funktioniert? Ich meine, dass Check NSNull funktioniert oder nicht? –

+0

Ich glaube nicht. Es geht immer in die if-Anweisung, selbst wenn der Wert null ist. Auch eine Sache der JSON gibt eine NULL mit Klammern um, wie (Null). –

+4

Zeigen Sie das vollständige Absturzprotokoll und beenden Sie die Verwendung von 'valueForKey:'. – trojanfoe

Antwort

1

Versuchen Sie, die unter Kontrolle

if(![dict objectForKey:kResponseRating] || [dict objectForKey:kResponseRating] == [NSNull null]) { 
    NSLog(@"Either the key doesn't exist or the value is null"); 
} 
else { 
    // Covert and set the rating here! 
} 
+0

Vielen Dank, es funktioniert. Nette Lösung. –

+2

Ein Eintrag in einem Wörterbuch ist höchstwahrscheinlich nicht gleich [NSNull-Klasse]. Es könnte gleich [NSNull null] sein, aber nicht [NSNull class]. Und für [NSNull null] müssen Sie nicht mit isEqual vergleichen: Verwenden Sie einfach ==. Höchstwahrscheinlich funktioniert das, weil es tatsächlich keinen Wert für den Schlüssel gibt. Der Code erkennt NULL im JSON-Dokument nicht. – gnasher729

+0

@ gnasher729 das war einer dieser Copy-Paste-Fehler. Danke, dass du darauf hingewiesen hast. – Vasanth

0

Dies sollte es tun.

if ([[dictionary valueForKey:@"key"] isKindOfClass:[NSNull class]] || ![dict valueForKey:@"key"]){ 
    // Key doesn't exist or equals <null> 
} 
else{ 
// Key exist 
} 

Und ich bin ziemlich sicher, es gibt viele Antworten auf diese Frage auf Stapelüberlauf. Sie sollten versuchen, herauszufinden, ob es eine Antwort auf Ihre Frage gibt, bevor Sie eine neue erstellen.

Wie auch immer, ich hoffe, das hilft

+0

Falls" key "nicht im Wörterbuch existiert, wird dieser Code den else Block ausführen. Versuchen Sie dieses Szenario, '{" Schlüssel1 ":" Wert 1 "}' und Sie suchen nach "Schlüssel" Es wird sagen, der Wert ist nicht null, was nicht wahr ist. – Vasanth

+0

Wenn der Schlüssel nicht im Wörterbuch vorhanden ist, gibt er null zurück -> welches ist '[NSNull Class]'. Probieren Sie es aus ... Und bevor Sie abstimmen, sollten Sie zuerst überprüfen, ob es funktioniert, weil Sie offensichtlich nicht wissen, wovon Sie sprechen. – dava

+0

Debug dieses Codes: NSDictionary * dict = @ {@ "key1": @ "Wert 1"}; if ([[dict valueForKey: @ "Schlüssel1"] isKindOfClass: [NSNull-Klasse]]) { // Dies bedeutet, dass der Wert innerhalb des Wörterbuchs NSLog (@ "KEY EXIST") ist; } else { // der Wert ist nicht NSLog (@ "NICHT EXISTIEREN"); } Danach entfernen Sie den Downvote. – dava

Verwandte Themen