2016-11-28 9 views
1

アクティビティインジケータがビューの上に追加されていて、アクティビティインジケータがオンのときにバックグラウンドで選択を無効にする必要があります。また何らかの理由で、データがテーブルビューに表示された後も、私の活動インジケータは約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

hideActivityIndi​​catorForViewへの呼び出しをdispatch_async(dispatch_get_main_queue()への呼び出しの中に移動します。これはUI呼び出しであり、メインスレッドで実行する必要があります。

ビューコントローラで他のアクションを無効にする方法については、いくつかの選択肢があります。私がした簡単なことの一つは、画面全体に固定されたビュー内にアクティビティインジケータを配置し、不透明= falseに設定し、アルファ設定0.5の黒色で設定することです。そのようにして、下のコンテンツは表示されますが、ユーザーはそのコンテンツをクリックできません。 "coveringView"にコンセントを追加して、アクティビティインジケータビューを表示/非表示にする代わりにそれを表示非表示にする必要があります。 dispatch_async内hideActivityIndi​​catorForViewコールを移動

+0

それを修正するには、私を助けました。今度は私の活動インジケータが消え、すぐに画面上にデータが表示されます。これにより、データが画面に表示されている間にアクティビティインジケータがまだ回転しているというシナリオは表示されません。私は不透明なカバリングビューを追加するのをスキップできるはずだと思う。ありがとう@ダンカンC! –

0

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

関連する問題