iPhone cellForRowAtIndexPath возвращает кэшированную ячейку - PullRequest
0 голосов
/ 01 марта 2010

Когда я добавляю метку в ячейку, используя:

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

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

Кто-нибудь знает способ обойти? Тон

Ответы [ 5 ]

2 голосов
/ 01 марта 2010

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

// 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];
...
}

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

1 голос
/ 01 марта 2010

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

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

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

1 голос
/ 01 марта 2010

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

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

0 голосов
/ 10 сентября 2010

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

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

Удаляет все подпредставления кэшированной ячейки.

0 голосов
/ 01 марта 2010

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

...