Выбранная кнопка UIB исчезает внутри выделенной UITableViewCell - PullRequest
5 голосов
/ 14 апреля 2010

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

Редактировать: включена моя реализация 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;

    }

Ответы [ 5 ]

6 голосов
/ 28 мая 2010

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

2 голосов
/ 16 апреля 2012

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

2 голосов
/ 05 мая 2011

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

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

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

2 голосов
/ 26 мая 2010

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

РЕШЕНИЕ: Я не совсем доволен этим взломом, но он работает для моих целей. По сути, я хочу, чтобы кнопка появлялась только тогда, когда выбрана ячейка. Подкласс 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];
}
0 голосов
/ 07 апреля 2013

Хитрость заключается в том, чтобы добавить 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];
    

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...