2010-04-13 5 views
5

У меня есть таблица, у меня есть делегат cellForRowAtIndexPath, и у меня есть экземпляр UITableViewCell, создаваемый внутри этого метода, который я возвращаю. Где-то в cellForRowAtIndexPath я также добавляю UIButton в cell.contentView этой ячейки. Все работает отлично, пока я не выберу эту ячейку с кнопкой. Ячейка меняет цвет на синий (это нормально), uibutton также меняет цвет на синий. Теперь, если я нажму на этот UIButton внутри выбранной ячейки, он просто исчезнет! Вау, это странно, как я могу это исправить? Я хочу, чтобы UIButton внутри выбранной ячейки оставался, когда я нажимаю на нее.Выбранный UIButton исчезает внутри выбранного UITableViewCell

Edit: включена моя реализация cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
static NSString *sectionsTableIdentifier = @" sectionsTableIdentifier "; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: sectionsTableIdentifier]; 


    for (UIView *view in cell.contentView.subviews) 
     [view removeFromSuperview]; 


    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
       reuseIdentifier: sectionsTableIdentifier] autorelease]; 

    } 

    CGRect newIconRect = CGRectMake(276, 40, 29, 29); 
     UIButton *newIcon = [[UIButton alloc] initWithFrame:newIconRect]; 
     [newIcon setImage:[UIImage imageNamed:@"mynewicon.png"] forState:UIControlStateNormal]; 
     [cell.contentView addSubview:newIcon]; 
     [newIcon release]; 


    return cell; 

    } 
+1

Можем ли мы увидеть содержимое вашего метода cellForRowAtIndexPath? 'tableView: didSelectRowAtIndexPath:' также было бы полезно, если бы вы его реализовали. – Tim

+0

Да, я включил его в редактирование, и у меня нет didSelectRowAtIndexPath, только cellForRowAtIndexPath – Mike

+0

Когда вы говорите, что кнопка «исчезает», скрывается ли она или она фактически перестает существовать? Вызывается ли обработчик щелчка кнопки, если вы нажимаете область, где она должна быть? –

ответ

6

я заметил подобный вопрос на OS беты 4.0, где у меня был UIButton в UITableViewCell с setImage: Форстат: UIControlStateNormal. Кнопка исчезнет, ​​когда я вернусь к представлению таблицы после выбора строки и нажатия другого вида таблицы. Чтобы преодолеть это, я setImage: forState: UIControlStateHighlighted на изображении. Я не уверен, что это решит вашу конкретную проблему, но это было для меня. Я думаю, что установка кнопки.highlighted = NO в didSelectRowAtIndexPath: возможно, сработала, но я не пробовал.

+1

Я все еще вижу это проблема в iOS 4.3. Это решение по-прежнему работает. – titaniumdecoy

2

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

РЕШЕНИЕ: Я не совсем доволен этим взломом, но он работает для моих целей. В принципе, я хочу, чтобы кнопка отображалась только тогда, когда ячейка выбрана. Подкласс UITableViewCell и добавьте эти переопределения (editButton - это экземпляр кнопки, который был добавлен в contentView ячейки в init).

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    editButton.hidden = YES; 

    [super setSelected: selected 
       animated: animated]; 

    editButton.highlighted = NO; 

    if (selected) 
     [editButton performSelector: @selector(setHidden:) 
         withObject: nil 
         afterDelay: 0.2]; 
} 

- (void)setSelected:(BOOL)selected { 
    editButton.hidden = YES; 

    [super setSelected: selected]; 

    editButton.highlighted = NO; 

    if (selected) 
     [editButton performSelector: @selector(setHidden:) 
         withObject: nil 
         afterDelay: 0.2]; 
} 
2

Эй, я знаю, что это старый пост, но это может быть полезно: UITableView попытается распространить свое состояние выбора во всей иерархии своих подзонов. Если одно подзапрос отвечает на -setHighlighted: оно будет обновляться в соответствии с состоянием выбора ячейки.

Это объясняет, почему кнопка становится синей (выделенной), а также почему изображение кнопки иногда исчезает: UIButton содержит экземпляры UIImageView для отображения своих изображений и будет менять изображение каждого изображения в соответствии с его состоянием (- [UIControl государство]). Но появляется таблица просмотра таблицы и устанавливает выделенный флаг представления изображения кнопки в YES (который кнопка не предвидела), но в этом представлении изображения нет изображения для его выделенного состояния, поэтому вы ничего не видите, даже если кнопка продолжает заменять изображений в соответствии с его состоянием.

Решение, которое я использовал, было, когда ячейка выбрана или выделена, я установил выделенный флаг изображения изображения кнопки НЕТ.

2

У меня также были проблемы с этим (для 4.3 и менее), и вышеприведенные решения не сработали для меня. Наконец, установка button.adjustsImageWhenHighlighted = NO; при создании кнопки сделал трюк для меня.

0

Фокус в том, чтобы добавить UIButton в качестве подзаголовка в UIImageView.

  1. Создание UIImage

    UIImage backgroundImg = [UIImage imageName:@"yourimg"]; 
    UIImageView imageView = [UIImageView alloc]initWithImage:backgrounding]; 
    
  2. Теперь создайте кнопку

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    // set the frame. the position of the button is the center 
    CGRect newIconRect = CGRectMake(imageView.center.x, imageView.center.y, 29, 29); 
    
    button.frame = newIconRect; 
    
  3. Наконец добавить кнопку на UIImageView

    [imageView addSubview:button]; 
    [cell addSubview imageView]; 
    

Теперь вам не нужно играть с цветом подсветки.

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