2010-02-28 3 views
0

Когда я добавить метку к клетке с помощью:iPhone cellForRowAtIndexPath возвращает кэшируются ячейку

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    [cell addSubView:someLabel]; 
} 

Он добавляет метку multple клеток, потому что он добавляет метку кэшированных ячейки. Таким образом, каждая ячейка в tableView, в которой используется кэшированная ячейка, будет отображать мою метку.

Кто-нибудь знает дорогу? Ton

ответ

0

Вам нужно будет отслеживать, имеет ли в каждой ячейке этикетку, которая в настоящее время применяется. В cellForRowAtIndexPath: проверьте, должно ли оно быть там, если да, тогда добавьте его, если необходимо, и удалите его, если необходимо.

+0

спасибо за ваш ответ, но зачем мне это делать? когда новые ячейки попадают на дисплей, он восстанавливает ячейку, поэтому мой ярлык не должен быть даже им. Я хочу, чтобы мой ярлык существовал, если пользователь нажимает кнопку аксессуара, когда ячейка уходит из представления, она должна уходить, потому что она перестроит ячейку. – Ton

+0

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

1

Если клетка является подклассом UITableViewCell, вы можете переопределить - (void)prepareForReuse который вызывается непосредственно перед клетка возвращается из - (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

Это способ обеспечить «чистый лист» для ваших клеток, но только которые будут повторно использоваться.

2

Дайте уникальное имя идентификатора, как:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = NSLocalizedString(@"Cell",@""); 
… 
} 

вместо того чтобы дать имя идентификатора постоянных, дать свое собственное имя, как уникальный идентификатор:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = [self getuniqueID]; 
... 
} 

Это позволит решить вашу проблему.

+0

Конечно, но вы теряете прокрутку. Это может быть хорошо для небольшого стола, но если есть сотни строк ... – jamesmoschou

1

Почему бы просто не упростить вещи и просто скрыть метку по умолчанию и включить ее во все ячейки.

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

Когда вы закончите, скройте этикетку.

0

Я иногда использую этот код: (Если ячейка = ноль!)

NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews]; 
for (UIView *subview in subviews) { 
    [subview removeFromSuperview]; 
} 
[subviews release]; 

Он удаляет все подвидов из кэшированных в клетке.

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