2012-06-02 2 views
-1

У меня проблема с индикатором UIActivity, я реализую индикатор активности на UITableView Cell, но он не работает. Мой код выглядит следующим образом: если его можно решить, пожалуйста, скажите мне ошибку, которую я делаю в этом.UIActivityIndicator on UITableViewCell не работает?

- (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]; 
} 

Thanks in Advance ..!

+0

удалите следующие из кода [таблица reloadData]; [индикаторная остановка]; показывает индикатор при их удалении? –

+0

Вы пробовали использовать '[self performSelectorOnMainThread: @selector (startAnimating :) withObject: indicator waitUntilDone: NO];'? – Mat

+0

Да, я также пробовал это, но проблема в том, что я не могу отправить в него несколько параметров. – Warewolf

ответ

1

Если и ¨R говорит, что метка добавляется как подтаблица работает над другими рядами, на которых 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; 
    } 
    } 
} 

релоад таблицу в блоке еще ...

0

Почему вы хотите запустить индикатор на другой поток? Evreyhting с пользовательским интерфейсом должен быть сделан на основном потоке.

Кстати, попробуйте добавить индикатор в ячейку. Вы должны добавить его в

cell.contentView

Это Неправильно:

[[tableView cellForRowAtIndexPath:indexPath] addSubview:indicator]

должны быть

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

1

методы UIKit должны выполняться в основном потоке, ваша загрузка метод должен быть отправлен не на основной поток.

И, возможно, чтобы помочь немного лучше: ЧТО не работает? Ошибки? Индикатор не отображается? Сбои?

Начните оживлять свой индикатор без вызова NSThread.

[indicator startAnimating]; 

Затем создайте очередь для загрузки ваших данных

dispatch_queue_t loadingQueue = dispatch_queue_create("loading Queue", NULL); 
dispatch_async(loadingQueue, ^{ 
// loading stuff 
} 
dispatch_release(loadingQueue); 
+0

индикатор не отображается – Warewolf

+0

Да, я думаю, его потому, что манипуляция UIKit должна выполняться в основном потоке (например, анимировать индикатор или другие виды) – Mario

+0

Пока не работает – Warewolf

Смежные вопросы