2012-12-05 99 views
1

我收到這條線以下的代碼錯誤NSNull isEqualToString問題隨着JSON響應

-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x3c168090 

cell.offerTitle.text = [voucherData objectForKey:@"offer_title"]; 

有人能幫助我解決這個問題嗎?

感謝 奧利弗

+0

是什麼voucherData? –

+2

從它的樣子,我懷疑你的字典中的某個鍵是某種原因的'NSNull'對象,在嘗試檢索這個對象之前檢查字典中的所有鍵 –

+0

嗨,我該如何去檢查上述關鍵首先是這樣做的!=無? – ORStudios

回答

6

voucherData是一個NSDictionary?

您的字典中可能有NSNull,當字典試圖找到offer_title的對象時,它會遇到麻煩。

另一種可能性是,[voucherData objectForKey:@"offer_title"]返回[NSNull null],並且當您嘗試傳遞該標籤而不是字符串時,該標籤正在被戳穿。

嘗試在objc_exception_throw中設置斷點並讀取堆棧跟蹤 - 這會讓您更好地瞭解正在發生的事情。

補充:

id value = [voucherData objectForKey:@"offer_title"]; 
if ([value isKindOfClass:[NSNull class]]) 
    cell.offerTitle.text = @""; 
else 
    call.offerTitle.text = value; 

這裏的最佳實踐
id value = [voucherData objectForKey:@"offer_title"]; 
cell.offerTitle.text = [value isKindOfClass:[NSNull class]] ? @"" : value; 
+0

嗨,voucherData是一個NSDictionary,它是一個來自網絡的JSON響應。 – ORStudios

+0

在運行代碼的下一部分之前,我將如何去檢查一個NSULL,正如你所提到的那樣。 – ORStudios

+1

添加代碼。但實際上,爲了解決這樣的問題,您應該設置斷點並讀取堆棧跟蹤,以便在發佈之前自行診斷或解決問題。任何比這更復雜的事情都很難僅憑直覺進行調試。 – paulmelnikow

-1

什麼從控制檯該行很可能告訴你的是,「voucherData」不是「NSDictionary」的對象,你認爲它是。

另外請確保您的手機中的「offerTitle」也是有效的UITextField

+1

如果voucherData爲null,則會返回無聲的'nil'。這不是Java。 – 2012-12-05 16:27:51

+0

錯誤是關於'-isEqualToString:',而不是'-objectForKey:'。 – paulmelnikow

0

一位候選人是使用isEqual:,不isEqualToString:。這樣,如果你得到的不是一個字符串,你不會得到一個錯誤,平等測試將會失敗。

另一方面,你可能會認爲isEqualToString:是一個不錯的選擇,因爲當你得到的不是一個字符串時,你有一個錯誤提醒你這個問題!

編輯:但是這是錯的;請參閱下面的評論。 isEqualToString:消息來自UIKit,而不是來自OP自己的代碼。

+0

這在這裏是不可能的,因爲調用是在UIKit中,而不是OP的代碼。 – paulmelnikow

+0

非常好的一點。事實上,我發生了一些非常類似的事情,它也是在UIKit中,而不是我的代碼。所以我的回答是錯誤的。我會把它留在這裏(編輯),以防我的錯誤對別人有幫助。 – matt

0

我做出一些改變了NOA的回答

-(NSDictionary*)safeData:(NSDictionary*)dict{ 
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:dict]; 
    NSArray *keys = dictionary.allKeys; 
    for (int i = 0; i < keys.count; i++){ 
     id value = [dictionary objectForKey:[keys objectAtIndex:i]]; 
     // you can add recursive here 
     value = [value isKindOfClass:[NSNull class]] ? @"" : value; 
     [dictionary setObject:value forKey:[keys objectAtIndex:i]]; 
} 
    return dictionary; } 

,並使用

dictionary = [self safeData:dictionary];