2016-11-28 3 views
1

활동 표시기가보기의 맨 위에 추가되며 활동 표시기가 켜져있을 때 i 그라운드에서 선택 사항을 사용하지 않으려합니다. 또한 어떤 이유로 데이터가 테이블보기에 표시된 후 내 활동 표시기가 약 30-45 초 동안 계속 회전합니다 (네트워크 속도에 따라 다름). 활동 표시기 카테고리를 만들었습니다.활동 표시기가있는 경우 배경에서 선택 해제

작동 표시 카테고리 코드 : 테이블 뷰 컨트롤러

- (UIView *)overlayView { 
    return objc_getAssociatedObject(self, OverlayViewKey); 
} 

- (void)setOverlayView:(UIView *)overlayView { 
    objc_setAssociatedObject(self, OverlayViewKey, overlayView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (void)showActivityIndicatorForView:(UIView *)view { 
    self.overlayView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]; 
    self.center = self.overlayView.center; 
    [view setUserInteractionEnabled:NO]; 
    [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 
    [self.overlayView setUserInteractionEnabled:NO]; 
    [self startAnimating]; 
    [self.overlayView addSubview:self]; 
    [view addSubview:self.overlayView]; 
    [view bringSubviewToFront:self.overlayView]; 
    self.hidesWhenStopped = YES; 
    self.hidden = NO; 

} 

- (void)hideActivityIndicatorForView:(UIView *)view { 
    [self stopAnimating]; 
    [self.overlayView setUserInteractionEnabled:YES]; 
    [self.overlayView removeFromSuperview]; 
    [[UIApplication sharedApplication] endIgnoringInteractionEvents]; 
    [view setUserInteractionEnabled:YES]; 
} 

용도 : 내가 잘못 무슨

@interface MyTableViewController() 
@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator; 
@end 

@implementation MyTableViewController 
- (id) initWithSomething:(NSString *)something { 
    self = [super init]; 

    if (self) { 
     self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
     self.activityIndicator.overlayView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    } 
    return self; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self getDataServiceRequest]; 
    [self.activityIndicator showActivityIndicatorForView:self.navigationController.view]; 
} 

- (void)requestCompletionCallBack sender:(ServiceAPI *)sender { 
// Do something here with the data 
    [self.activityIndicator hideActivityIndicatorForView:self.navigationController.view]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
    }); 
} 
@end 

을하고 있는가? 활동 표시기가 켜져 있고 사용자 상호 작용을 사용 중지 한 후에도 백그라운드에서 데이터를 선택할 수있는 이유는 무엇입니까?

답변

0

hideActivityIndicatorForView에 대한 호출을 dispatch_async(dispatch_get_main_queue() 호출 내로 이동하십시오. 이것은 UI 호출이며 메인 스레드에서 수행해야합니다.

보기 컨트롤러에서 다른 작업을 사용하지 않도록 설정하는 방법에 대한 몇 가지 옵션이 있습니다. 내가 한 일은 간단합니다. 전체 화면에 고정 된보기 내부에 활동 표시기를 놓고, opaque = false로 설정하고 알파 설정이 0.5 인 검정색으로 설정합니다. 그렇게하면 내용이 보이지만 사용자가 클릭 할 수 없습니다. 콘센트를 "coveringView"에 추가하고 액티비티 표시기보기를 표시하거나 숨기는 대신 표시하지 않도록해야합니다. dispatch_async 내부 hideActivityIndicatorForView 전화를 이동

+0

나를 도왔다. 이제 내 활동 표시기가 사라지고 곧 화면에 데이터가 표시됩니다. 이걸로 나는 데이터가 화면에있는 동안 활동 지표가 여전히 회전하고있는 시나리오를 보지 못합니다. 불투명 한 커버 뷰를 추가하지 않아도된다고 생각합니다. 고마워요 @ 던컨 C! –

0

dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); 수정이 [self performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];