2013-02-19 2 views
0

у меня есть UITableView с настраиваемыми клетками .. с нормальным кодомIOS: UITableView перерисовывать объекты на первую ячейку в нижние клетки

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    DDMainCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    if (cell == nil) 
    { 
     cell = [[DDMainCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 



    } 
} 

проблема, когда я выбрать одну ячейку я добавить индикатор прогресса на ячейке, скачать данные онлайн .., но когда я прокручиваю вниз, я обнаружил, что каждые 10 ячеек имеют одинаковый индикатор выполнения. Как я могу предотвратить это поведение?

ответ

1

Попробуйте это,

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
dataarr=[[NSMutableArray alloc]init]; 
indexarr=[[NSMutableArray alloc]init]; 
mytableview=[[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; 
mytableview.dataSource=self; 
mytableview.delegate=self; 
[self.view addSubview:mytableview]; 
for (int i=0; i<30; i++) { 
    [dataarr addObject:[NSString stringWithFormat:@"%d",i]]; 
} 
// Do any additional setup after loading the view, typically from a nib. 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
// Return the number of sections. 
return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
// Return the number of rows in the section. 
return [dataarr count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 


static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ; 
} 
cell.textLabel.text=[dataarr objectAtIndex:indexPath.row]; 
UIActivityIndicatorView *act=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
[act setFrame:CGRectMake(50, 20, 20, 20)]; 
act.hidden=YES; 

[cell.contentView addSubview:act]; 
cell.selectionStyle=UITableViewCellSelectionStyleNone; 
if ([indexarr containsObject:[dataarr objectAtIndex:indexPath.row]]) 
{ 
    [act startAnimating]; 

    act.hidden=NO; 
    return cell; 

} 


return cell; 
} 

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

if ([indexarr containsObject:[dataarr objectAtIndex:indexPath.row]]) 
{ 
    [mytableview reloadData]; 

    return; 
} 
[indexarr addObject:[dataarr objectAtIndex:indexPath.row]]; 
[mytableview reloadData]; 

} 

Убедитесь, при загрузке завершена, а затем удалите этот объект из indexarr ....

+0

Хорошо, я сделал это, но все равно это происходит в нижних ячейках. –

+0

Вы можете проверить, поставив точку останова. что такое индекс, когда вы прокручиваете вниз .. и сравниваете его с тем, когда вы вставляете в arr. – Kalpesh

+0

он отлично работает, потому что я реализовал это в своем приложении. – Kalpesh

0

Это потому, что ваши ячейки используются повторно; UITableView будет выставлять экранные ячейки в очередь многократного использования и деактивировать их для повторного использования, если соответствует reuseIdentifier. Вы должны использовать некоторую другую структуру данных (например, NSArray или NSDictionary), чтобы отслеживать, какие индексы/ячейки уже были использованы. Затем в методе, который вы указали выше, независимо от того, была ли ячейка инициализирована или удалена, установите индикатор выполнения в соответствии с вашей базовой структурой данных.

-1

Здесь ваш используется UITableViewCellIdentifier является reuseIdentifier. Что будет работать для всех ячеек одного типа. Теперь вы принимаете ячейку с индикатором выполнения. Теперь он будет отличаться от всех данных ячеек.

Итак, используйте еще одну ячейку таблицы для индикатора выполнения или во время перезагрузки таблицы удалите индикатор выполнения, который уже существует, и добавьте еще раз. для этого используйте тег для индикатора выполнения.

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