0

私のココア アプリは、ネットワークからデータを取得する必要があり、テーブル ビューにコンテンツを表示します。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 を正しく使用する方法を教えてください。

ありがとう!

4

1 に答える 1

0

マルチスレッドが原因でした。

メインブロックを使用して進行状況インジケーターを表示し、- (void)loadOperationDataバックグラウンドでデータをフェッチするスレッドを作成します。ブロックは非同期で実行され、 -(void)reloadTableview.

最後に、メイン スレッドで呼び出されたままにして、ブロック- (void)loadOperationDataの外に置きます。- (void)_showIndicatorその後、修正されます。

于 2012-09-13T09:31:36.727 に答える