-1

UIActivityインジケーターに関して問題があります。UITableViewセルにアクティビティインジケーターを実装していますが、機能していません。私のコードは次のとおりです。解決できる場合は、私が行っている間違いを教えてください。

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

 UIActivityIndicatorView *indicator=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];


    if (segmentControl.selectedSegmentIndex==0) 
    {
       if ([indexPath row]==[FriendSuggestion count]) 
       {
        int cursor=[Constants getCursorForKey:@"friendList_cursor"];

        if (cursor!=0) 
        {
         [[tableView cellForRowAtIndexPath:indexPath] addSubview:indicator];
         [indicator setFrame:CGRectMake(40, 25, 37, 37)];
         [NSThread detachNewThreadSelector:@selector(startAnimating) toTarget:indicator withObject:nil];


         dispatch_async(dispatch_get_main_queue(), ^{
          [self loadingMore:indexPath :indicator :cursor];
         });


        }else
         isNoMoreData=YES;

        [tableView reloadData];
       }
    }
    else
    {
       if ([indexPath row]==[popularSuggestion count]) 
       {
        int cursor=[Constants getCursorForKey:@"popularList_cursor"];  

          if (cursor!=0) 
          {
           [[tableView cellForRowAtIndexPath:indexPath] addSubview:indicator];
           [indicator setFrame:CGRectMake(40, 25, 37, 37)];
           [NSThread detachNewThreadSelector:@selector(startAnimating) toTarget:indicator withObject:nil];


           dispatch_async(dispatch_get_main_queue(), ^{
            [self loadingMore:indexPath :indicator :cursor];
           });


          }else
           isNoMoreData=YES;

        [tableView reloadData];
       }
    }
}


-(void)loadingMore:(NSIndexPath*)indexPath:(UIActivityIndicatorView*)indicator:(int)cursor
{

 NSLog(@"loading more called ...");

 if (segmentControl.selectedSegmentIndex==0) 
 {

            isNoMoreData=NO;
            NSArray *nextArray=[[NSArray alloc] init];
            nextArray=[Constants getFriendsSuggestionsStr:cursor];

            for (NSDictionary *dic in nextArray) {
             [FriendSuggestion addObject:dic];
            }
 }else
 {     
             isNoMoreData=NO;
             NSArray *nextArray=[[NSArray alloc] init];
             nextArray=[Constants getPopularSuggestionsStr:cursor];

             for (NSDictionary *dic in nextArray) {
              [popularSuggestion addObject:dic];
             }
 }

 [table reloadData];
 [indicator stopAnimating];
}

前もって感謝します..!

4

3 に答える 3

1

サブビューとして追加されたラベルが、Uが条件を適用していない他の行で機能していると言っている場合。それからそれはあなたのセルに追加されるかもしれません、そしてテーブルをリロードした後それは消えます。いくつかの変更を加えてメソッドを試してください:

    if (segmentControl.selectedSegmentIndex==0) 
{
   if ([indexPath row]==[FriendSuggestion count]) 
   {
    int cursor=[Constants getCursorForKey:@"friendList_cursor"];

    if (cursor!=0) 
    {
     [[tableView cellForRowAtIndexPath:indexPath] addSubview:indicator];
     [indicator setFrame:CGRectMake(40, 25, 37, 37)];
     [NSThread detachNewThreadSelector:@selector(startAnimating) toTarget:indicator withObject:nil];


     dispatch_async(dispatch_get_main_queue(), ^{
      [self loadingMore:indexPath :indicator :cursor];
     });


    }else
    {
     [tableView reloadData];
     isNoMoreData=YES;
   }
   }
}

elseブロックにテーブルをリロードします。

于 2012-06-02T12:11:58.587 に答える
1

UIKit メソッドはメイン スレッドで実行する必要があり、ロード メソッドはメイン スレッドではなくディスパッチする必要があります。

そして、おそらくもう少しうまくいくのを助けるために:何がうまくいかないのですか?エラー?インジケーターが表示されない?クラッシュ?

NSThread 呼び出しなしでインジケーターのアニメーション化を開始します。

[indicator startAnimating];

次に、データをロードするためのキューを作成します

dispatch_queue_t loadingQueue = dispatch_queue_create("loading Queue", NULL);
dispatch_async(loadingQueue, ^{
 // loading stuff
}
dispatch_release(loadingQueue);
于 2012-06-02T09:50:35.550 に答える
0

なぜ別のスレッドでインジケーターを開始したいのですか? UI の処理は、メイン スレッドで行う必要があります。

ちなみに、セルではなくインジケーターを追加してみてください。に追加する必要があります

cell.contentView

これは間違っています:

[[tableView cellForRowAtIndexPath:indexPath] addSubview:indicator]

あるべき

[[[tableView cellForRowAtIndexPath:indexPath] contentView] addSubview:indicator]

于 2012-06-02T09:46:43.600 に答える