2017-12-29 10 views
0

iOS에서 json을 배우려고합니다. UITableView을 사용하여 json 데이터를 구현하려고합니다. 제목 및 부제의 내 tableview 행에 값이 표시됩니다. 제목에 데이터를로드 할 수 있지만 부제로로드하려고하면 부제가 이고 결과는이며 json의 해당 필드에 많은 키 쌍 값이 주어지기 때문에 앱이 다운됩니다. 그래서 그것은 tableview에서 서브 제목으로 표시 할 수 없습니다.키 쌍의 키를 확인하는 방법을 사용할 수 있습니까?

내 질문은 어떻게 자막을로드 할 수 있으며 많은 키 쌍 값을 사용할 수있는 경우 해당 데이터를 표시하기 위해 다른 tableview로 리다이렉트됩니다.

내 코드 :

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://query.yahooapis.com/v1/public/yql?q=select+*+from+weather.forecast+where+woeid%3D1100661&format=json"]]; 
    NSError *error=nil; 
    id response=[NSJSONSerialization JSONObjectWithData:data options: 
       NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:&error]; 
    if (error) { 
     NSLog(@"%@",[error localizedDescription]); 
    } else { 
     _query = [response objectForKey:@"query"]; 
     NSLog(@"%@",_query); 
     _keyArray = [_query allKeys]; 
    } 
} 


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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *cellIdentifier = @"cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] ; 
    } 

    NSString *key = [_keyArray objectAtIndex:indexPath.row]; 
    //NSString *dictionary = [_query objectForKey:key]; 
    NSString *dictionary = [_query objectForKey:key]; 
    cell.textLabel.text = key; 
    cell.detailTextLabel.text = dictionary; 
    return cell; 
} 

감사합니다.

+0

에 따라 다름. cell.detailTextLabel에 무엇을 표시 하시겠습니까? –

+0

저는 여기서 당신이 정말로 결과물로 얻고 자하는 것을 이해하기는 매우 어렵지만, 할 수는 없습니다. 이 결과로 정말로 원하는 것을 언급 한 이미지를 추가하십시오. –

+0

자막 값이 새 사전 인 경우 하위 키 - 값 쌍을 표시하려면 테이블 뷰를 확장하거나 새 테이블 뷰로 푸시시겠습니까? –

답변

1

것들 내가 단계별로 내 대답 단계 ...

우선이 같은 내 ViewController.h 클래스의 NSArrayNSDictionary 속성을 촬영 한 여기, 당신의 질문과 의견 출신 이해했습니다.

{ 
NSArray *_allKeys; 
} 
@property(nonatomic,strong) NSDictionary *query; 

다음 ViewController.m에 나는 UITableView 데이터 소스 방법 cellForRow

-(void)setQuery:(NSDictionary *)query 
{ 
    _query = query; 
    _allKeys = [_query allKeys]; 
    if ([self isViewLoaded]) { 
     [tableView reloadData]; 
    } 

} 

지금은 _query이 같은 _allKeys에 데이터를 설정하고 query 특성, ...에 대한 setter 메소드를 만들었습니다, I 코드를 업데이트했습니다.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 
    NSString *key = _allKeys[indexPath.row]; 
    id value = _query[key]; 
    cell.textLabel.text = key; 
    if ([value isKindOfClass: [NSString class]]) { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.detailTextLabel.text = (NSString*)value; 
    } 
    else if ([value isKindOfClass: [NSDictionary class]]) 
    { 
     cell.detailTextLabel.text = @"More Info"; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 
    else if ([value isKindOfClass: [NSArray class]]) 


     { 
      cell.detailTextLabel.text = @"Multiple Entries Found"; 
      cell.accessoryType = UITableViewCellAccessoryNone; 

// do something show array data with prototype custom cell 
     } 
     return cell; 
    } 

그리고 지금은 I 돈 :대리자 메서드 didSelect, 나는 같은 ViewController (우리는이 같은 UI 레이아웃을 가지고 있기 때문에 그것을 다시 사용할 수 있습니다), 그리고 _query의 값을 전달

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *key = _allKeys[indexPath.row]; 
    id value = _query[key]; 
    if ([value isKindOfClass: [NSDictionary class]]) 
    { 
     ViewController *nextVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; 
     nextVC.query = value; 
     [self.navigationController pushViewController:nextVC animated:YES]; 
    } 
} 

참고 새 인스턴스를 만들이 ViewController 인스턴스를 인스턴스화 할 때마다 호출을 ViewController.m에 호출하고 싶지 않습니다. 그래서 저는 webservice 코드를 AppDelegatedidFinishLaunch 메서드에 넣습니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://query.yahooapis.com/v1/public/yql?q=select+*+from+weather.forecast+where+woeid%3D1100661&format=json"]]; 
    NSError *error=nil; 
    id response=[NSJSONSerialization JSONObjectWithData:data options: 
       NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:&error]; 
    if (error) { 
     NSLog(@"%@",[error localizedDescription]); 
    } else { 
    NSDictionary* _query = [response objectForKey:@"query"]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      ViewController *vc = (ViewController*)[(UINavigationController*)self.window.rootViewController topViewController]; 
      vc.query = _query; 
     }); 
    } 
    // Override point for customization after application launch. 
    return YES; 
} 

그것은 당신이 코드를 넣어하지만, 어디에 가장 바람직하게는 우리가 이전 UIViewController에 다음 코드를 삽입해야한다는 당신까지 당신의 DatashowingViewController (광산 ViewController이다)와 (내가했던 것처럼) ViewController에 정보를 전달 따라서 동일한 결과를 표시하기 위해 동일한 UIViewController을 다시 사용할 수 있습니다.

출력물을 얻는 데 도움이 되길 바랍니다.

+0

응용 프로그램이 dispatch_async (dispatch_get_main_queue(),^{ )에서 작동을 멈 춥니 다. ViewController * vc = (ViewController *) [(UINavigationController *) self.window.rootViewController topViewController]; vc.query = _query; }); –

+0

ViewController에서 응답 데이터를 전달하는 방법을 보여줍니다. 이제 당신이 응용 프로그램 창의 rootViewController 인 UINavigationController의 topViewController로서 Viewcontroller를 가지고 있다고 말해 주시겠습니까? –

+0

위의 주석에 navigationviewcontroller와 내 코드가 포함될 수 없습니다. –

관련 문제