2011-12-25 3 views
0

임 말한다 내 코드, 그 반환 오류에 문제가 ...아이폰 JSON의 TableView에

2011-12-24 22 : 52 : 36.280 BusinessManager [479 : 20B]에 의한 * 종료 애플 리케이션 캐치되지 않는 예외 'NSInvalidArgumentException'이유로 -

#import "BusinessManagerAppDelegate.h" 
#import "ProspectViewController.h" 
#import "JSON.h" 

@implementation ProspectViewController 

@synthesize jsonArray; 

- (void)viewDidLoad { 
NSURL *jsonURL = [NSURL URLWithString:@"https://www.mysite.php"]; 
NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL]; 

NSLog(jsonData); 
self.jsonArray = [jsonData JSONValue]; 

[jsonURL release]; 
[jsonData release]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  { 
return [jsonArray count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
static NSString *Prospects = @"agencyname"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Prospects]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:Prospects] autorelease]; 
} 

cell.text = (NSString *)[self.jsonArray objectAtIndex:indexPath.row]; 
return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

} 

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
[super viewDidAppear:animated]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
} 

- (void)viewDidDisappear:(BOOL)animated { 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
} 

- (void)dealloc { 
[jsonArray dealloc]; 
[super dealloc]; 
} 

@end 
,617 :> 여기서

'* [NSCFDictionary isEqualToString는 :] 미정 선택기 인스턴스 0x3e965e0 전송'은 코드

메신저 나는 모든 것이 올바르게 설정되어 있고 JSON이 콘솔에서 올바르게 반환되고 있음을 확신합니다.

답변

2

cell.textLabel.text = (NSString *)[self.jsonArray objectAtIndex:indexPath.row];
:

줄 가능성이 오류 인 (EDIT 원래 코드 cell.textcell.textLabel.text보다 오히려 액세스되었음을 참고). 단계별로 살펴 보겠습니다.
1. JSON 출력은 jsonArray에 저장된 배열입니다 (사전이 아닌지 확인하십시오).
2. [self.jsonArray objectAtIndex:indexPath.row]은 NSDictionary 일 가능성이 큽니다. 돌아 오는 예외에서 알 수 있듯이 NCSFDictionary가 관련되어 있습니다. 사실, 몇번 JSON 출력은 사전 오류 'NSInvalidArgumentException'로
(3)의 배열, 이유는 '* - [NSCFDictionary isEqualToString는 :] : 미정 선택기 인스턴스 0x3e965e0 전송'>
이 코드는 NSString을 NSString과 비교하려고합니다.
4.이 문제를 해결하려면 JSON 출력을보다 자세히 살펴보고 해부하십시오! JSON 출력이 대소 문자에 따라 다르지 않은지 확인하십시오 (다른 URL 사용).

+0

NSDictionary JSON과 NSArray JSON 사이의 차이점을 알지 못합니다. 여기에 JSON [{ "0": "Test Agency", "agencyname" : "Test Agency"}, { "0": "Test Agency", "agencyname": "Test Agency"}] – savagenoob

+0

JSON을 파싱 할 때 Objective-C로 변환합니다. 이것은 NSDictionary 나 NSArray 중 하나 일 수 있습니다. NSDictionaries에 대한 자세한 내용은 http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html을 참조하십시오. 기본적으로, 당신은 그것을'NSDictionary * infoDictionary = [self.jsonArray objectAtIndex : indexPath.row]'로 변경하기를 원할 것입니다. 그런 다음'cell.text = [infoDictionary objectForKey : @ "agencyname"]'을 수행하십시오. NSDictionary는 "키"와 "값"("에이전시 이름"-> "테스트 에이전시" – Louis

+0

당신을 사랑합니다. 이것을 하루 종일 알아 내려고 노력하는 것들을 저장하는 방법입니다. – savagenoob

0

게시 한 코드는 충돌과 관련이 없습니다. Xcode의 검색 네비게이터를 사용하여 코드에서 isEqualToString :을 찾아서 중단 점을 배치하십시오. 이 충돌을 일으키는 객체를 찾을 때 NSString 대신 NSDictionary가되는 이유를 찾으십시오 (아마 잘못된 값을 지정했기 때문일 수 있습니다).

+0

그래서 코드에 뭔가 문제가 있다고 생각. – savagenoob

+0

그러면 NSString 대신 NSString을 구문 분석하기 위해 패스합니다. – Max

0

JSONValue에서 NSDictionary를 얻을 수 있습니다. 즉, 사전을 가져와 테이블에 표시 할 각 값을 가져와야한다는 의미입니다. isEqualToString는 JSON 클래스에

NSDictionary *dictionary = [self.jsonArray objectAtIndex:indexPath.row]; cell.textLabel.text = [dictionary objectForKey:@"agencyname"];