2013-10-18 2 views
0

나는이 문제에 관한 많은 게시물을 성공적으로 검토했습니다. 두 테이블보기 컨트롤러, 소스 및 대상 탐색 컨트롤러에서 모두 있습니다. 사용자가 소스 테이블 뷰 컨트롤러에서 셀을 탭하면 네트워크 속도에 따라 수 초가 걸릴 수있는 웹 서비스 호출을 만드는 객체가 인스턴스화됩니다. 이 웹 서비스 호출이 이루어지면 segue가 실행되고 탐색이 소스에서 대상으로 이동합니다. 이 웹 서비스 호출이 언제 표시되는지 알려주고 싶습니다. 지난 며칠 동안 노력한 것은 없으며,이 포럼에서 성공한 것으로 표시된 게시물조차도 효과가있었습니다. 테이블 뷰 컨트롤러 헤더UIActivityIndicatorView가 렌더링하지 않습니다.

출처 :

@property (strong, nonatomic) UIActivityIndicatorView *activityIndicator; 

소스 테이블 뷰 컨트롤러 구현 :

@synthesize activityIndicator; 

-(void)loadView { 
    [super loadView]; 
    self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    [self.view addSubview:self.activityIndicator]; 
    self.activityIndicator.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2); 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    NSString *stateAbbr; 

    if([segue.identifier isEqualToString:@"sgShowStateDetail"]){ 
     DetailTableViewController *detailVC = [segue destinationViewController]; 
     NSIndexPath *path = [self.tableView indexPathForSelectedRow]; 
     NSArray *tempArray = (NSArray*)[groupedStates objectAtIndex:path.section]; 
     NSString *key = [tempArray objectAtIndex:path.row]; 
     stateAbbr = [statesDict objectForKey:key]; 
     [detailVC setStateIdentifier:stateAbbr]; 

     // begin activity indicator here 

     [self.view bringSubviewToFront:activityIndicator]; 
     [activityIndicator startAnimating]; 

     gauges = [[GaugeList alloc] initWithStateIdentifier:stateAbbr andType:nil]; 

     [activityIndicator stopAnimating]; 
     [detailVC setStateGauges:gauges]; 

     // end activity indicator here 

    } 
} 

GaugeList 객체입니다 그래서 뭔가 ... 여기까지 내 코드가 존재해야 웹 서비스 호출을 수행합니다.

활동 표시기가없는 것을 제외하고는 예상대로 작동합니다. 오류가 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 감사!

+0

보다는 tableView: didSelectRowAtIndexPath: 방법을 사용하여 코드는? 이 줄 이니? 게이지 = [[GaugeList alloc] initWithStateIdentifier : stateAbbr andType : nil]; – Pei

+0

예, 수정 된 원본 글은이를 반영합니다. 감사! –

+1

그러면 prepareForSegue에서이를 수행하면 안됩니다. 또는 차단되고 UI가 전혀 새로 고쳐지지 않습니다. tableView : didSelectRowAtIndexPath : 메소드에 동일한 코드를 넣을 수 있습니다. – Pei

답변

1

잘못된 패턴을 사용하고있는 것 같습니다. 웹 서비스에 대한 호출은 백그라운드에서 수행되어야하며, 활동 표시기는 주 스레드에서 표시되고 숨겨 져야합니다. 따라서 여기에

__block NSArray *gauges; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    gauges = [[GaugeList alloc] initWithStateIdentifier:stateAbbr andType:nil]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [activityIndicator stopAnimating]; 
     [detailVC setStateGauges:gauges]; 
    }; 
}; 
0

prepareForSegue: 웹 서비스에 대한 호출입니다

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self.view bringSubviewToFront:activityIndicator]; 
    [activityIndicator startAnimating]; 

    dispatch_async(dispatch_queue_create("", nil),^{ 

     NSString *stateAbbr; 

     DetailTableViewController *detailVC = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailTableViewController"]; 
     NSArray *tempArray = (NSArray*)[groupedStates objectAtIndex:indexPath.section]; 
     NSString *key = [tempArray objectAtIndex:indexPath.row]; 
     stateAbbr = [statesDict objectForKey:key]; 
     [detailVC setStateIdentifier:stateAbbr]; 

     gauges = [[GaugeList alloc] initWithStateIdentifier:stateAbbr andType:nil]; 
     [detailVC setStateGauges:gauges]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [activityIndicator stopAnimating]; 
      [self.navigationController pushViewController:detailVC animated:YES]; 
     }); 
    }); 
} 
+0

불행히도, 이것은 정말로 이상한 행동을 일으 킵니다. 대상이로드되었지만 처음에는 비어 있습니다. 그런 다음 렌더링하지만 탐색 컨트롤러가 사라집니다. 그리고 활동 표시기는 절대로 표시되지 않습니다. presentViewController가 푸시하지 않고 모달 뷰를 표시한다고 가정합니다. –

+1

내비게이션 컨트롤러에 ViewController가 있습니까? – Pei

+0

네, 다시 사과하고 이것을 반영하기 위해 메인 포스트를 편집했습니다. –

관련 문제