2013-04-24 3 views
1

У меня проблема, установив кнопку на UITableviewCell.
После viewDidLoad кнопка находится в правильном месте. Но когда я прокручиваю вниз, кнопка в любом месте.
UITableView Cell Button перепутана

Вот мой код, надеюсь, вы можете мне помочь.
Спасибо заранее.

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

if (indexPath.section == 0 && indexPath.row == 0 && _isAddImageViewLoad == NO) { 
    // Add Image Button 
    UIButton *addImage = [UIButton buttonWithType:UIButtonTypeCustom]; 
    UIImage* image = [UIImage imageNamed:@"[email protected]"]; 
    addImage.frame = CGRectMake(110.0f, 10.0f, 110.0f, 110.0f); 
    [addImage setImage:image forState:UIControlStateNormal]; 

    [cell.contentView addSubview:addImage]; 
    _isAddImageViewLoad = YES; 
} else { 
    NSDictionary *dictionary = [_items objectAtIndex:indexPath.section]; 
    NSArray *array = [dictionary objectForKey:@"data"]; 
    NSString *cellValue = [array objectAtIndex:indexPath.row]; 
    cell.textLabel.text = cellValue; 
} 

return cell; 

}

+0

Не могли бы вы дать дополнительную информацию и сделать ее более понятной в чем проблема? – CoffeeRain

ответ

0

Всего пару вещей. Если вы используете «AddImage», он автоматически использует «AddImage @ 2x», если это сетчатый дисплей. Я не думаю, что это решит вашу проблему, но это может вызвать странность.

Когда ячейка просмотра таблицы прокручивается из вида, она «переработана» в некотором смысле. Похоже, вы используете bool, чтобы исключить загрузку исходной ячейки с помощью кнопки. Вы можете использовать заголовок, чтобы удерживать кнопку, если вы всегда хотите ее на «верх». Вы также можете проверить, что кнопка удаляется, когда ячейка повторно используется. если его не будет отображаться в следующей строке, которая повторно использует эту ячейку.

На боковой ноте ... Кнопки обычно не очень хорошо работают в виде таблиц, потому что они обрабатывают касания совершенно по-разному. Это довольно немного изменений, чтобы заставить их чувствовать себя естественными, но это другое дело.

Надеюсь, что это поможет!

+0

Большое спасибо. Для моей проблемы это было лучше всего, чтобы установить кнопку в заголовок. – mooco

+0

Рад, что я мог помочь! Интересно, что у меня недавно был вопрос с интервью, и это было «Как вы получаете UIButton для правильной работы в UITableViewCell». Это был довольно сложный вопрос: – Kibitz503

0

Посмотрите на эту строку кода:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

Эта строка кода означает, что UITableViewCells не создаются каждый раз. Они повторно используются при прокрутке вверх и вниз. Используя код, который у вас выше, UIButton будет создан в нужном месте, но затем, когда ячейки будут повторно использованы, он создаст кнопку в случайных точках.

Один быстрый способ решить эту проблему, измените эту строку коды просто

UITableViewCell *cell; 
+0

Тогда он не будет повторно использовать ячейки, и производительность прокрутки будет страдать – JeffN

+0

Вместо того, чтобы повторно использовать ячейку, лучше использовать два отдельных идентификатора для одного с кнопкой, а другие - не с – Anupdas

+0

Это тоже вариант, но не повторное использование ячеек, опция – JeffN

1

Это происходит потому, что вы повторно клетку, и кнопка становится помещено, когда он не должен простым решением в вашем разделе. Напишите addImage.hidden = YES; и в вашем заявлении, если положить addImage.hidden = NO;

0

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

addImage.tag = 10; 

Затем в еще пункт:

}else{ 
    if (cell viewWithTag:10) [[cell viewWithTag: 10] removeFromSuperview]; 
    ... 
0

Проблемы из-за DEQUEUE для клеток. В первый раз, когда представление таблицы создает ячейки, все ячейки проходят через

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 

код. Но когда участок 0 строки 0 перемещается с экрана, эта ячейка помещается в очередь многократного использования ячейки.

Теперь, когда ваш стол должен отображать раздел 0, строка 0, он получит ячейку из очереди повторного использования. вы не получите одну и ту же ячейку, как в первый раз.Итак, теперь у вас может быть 2 ячейки с кнопкой.

Что вы должны сделать, так это иметь различный CellIdentifier для раздела 0 row 0 и всех других разделов и строк. Также создайте кнопку при создании ячейки. Таким образом, после первого запуска tableView создает ячейку, вы не будете создавать кнопку все.