私のココア アプリは、ネットワークからデータを取得する必要があり、テーブル ビューにコンテンツを表示します。NSProgressIndicator
そこで、データのダウンロード時にアニメーション化する回転スタイルを追加します。その後、 のアニメーションがNSProgressIndicator
停止し、 をリロードしNSTableView
ます。奇妙なことに、テーブル ビューのリロード後、表示されるコンテンツは更新されません。次に、テーブルビューをスクロールすると、次のようにコンテンツが表示され始めます:
(上の小さな長方形は、のフレームですNSProgressIndicator
)
以下は私のコードです:
- (void)loadOperationData
{
dispatch_async(dispatch_get_main_queue(), ^{
[self _showIndicator];
});
[NSThread detachNewThreadSelector:@selector(getOperationLogProcess) toTarget:self withObject:nil];
}
- (void)_showIndicator
{
if (indicator == nil)
{
indicator = [[NSProgressIndicator alloc] init];
[indicator setStyle:NSProgressIndicatorSpinningStyle];
[indicator setUsesThreadedAnimation:NO];// I tried to comment this, but no use
int width = 30;
CGRect rect = CGRectMake(0, 0, width, width);
NSRect selfRect = [_coverView frame];
rect.origin.x = selfRect.size.width/2 - width/2;
rect.origin.y = selfRect.size.height/2 - width/2;
indicator.frame = rect;
[_coverView addSubview:indicator];
}
[indicator setHidden:NO];
[indicator startAnimation:self];
}
-(void)getOperationLogProcess{
NSDictionary *tempResutDic = [WebServiceManager getOperationLog];//using synchronous ASIHttpRequest to download data
if ([[tempResutDic objectForKey:@"resultCode"] intValue]==100) {
self.operationLogArray = [tempResutDic objectForKey:@"items"];
[self performSelectorOnMainThread:@selector(reloadTableview) withObject:nil waitUntilDone:YES];//refresh UI in main thread
}
}
-(void)reloadTableview
{
[indicator stopAnimation:self];
[indicator setHidden:YES];
[operationlogTable setEnabled:YES];
if ([_coverView isHidden])
{
return;
}
self.lastUpdateDate = [NSDate date];
[operationlogTable reloadData];
}
は -(void)loadOperationData
、マウス クリック イベントによって呼び出されます。をディスパッチ ブロックに入れた理由 -(void)_showIndicator
は、インジケーターを表示できないためです。色々試して最終的に選びました。
問題はインジケーターの表示方法に密接に関係していると思います。インジケーターに関するコードにコメントすると、問題は解決したからです。
ユーザーに待機中であることを知らせるインジケーターが本当に必要です。NSProgressIndicator を正しく使用する方法を教えてください。
ありがとう!