Удаление UIButton из UITableViewCell - PullRequest
0 голосов
/ 14 марта 2012

У меня проблема с удалением UIButton из подкласса UITableViewCell.Эта кнопка добавляется, только если ячейка является первой в табличном представлении.Так что бывает, что эта кнопка может быть нулевой или может быть экземпляром класса UIButton.Более того, поскольку все эти ячейки имеют одинаковый идентификатор, может возникнуть ситуация, когда первая ячейка с кнопкой будет перемещена ниже.Затем мне нужно удалить эту кнопку.

Я делаю это таким образом:

if(callBtn != nil) {
    [callBtn removeFromSuperview];
}

Однако, это вызывает сбой приложения.

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

@ EDIT: код, в котором создаются ячейки:

NSString *ident = @"HistoryCell";
HistoryItemCell *cell = (HistoryItemCell *)[tableView dequeueReusableCellWithIdentifier:ident];
// If there is no reusable cell of this type, create a new one
if (!cell) {
    if(indexPath.row == 0) {
        cell = [[[HistoryItemCell alloc] initWithStyle:UITableViewCellStyleDefault withCallBtn:YES reuseIdentifier:ident] autorelease];
    } else {
        cell = [[[HistoryItemCell alloc] initWithStyle:UITableViewCellStyleDefault withCallBtn:NO reuseIdentifier:ident] autorelease];
    }
} else {
    if(indexPath.row != 0) {
        [cell removeCallBtn];
    }
}

History *history = [[[Store defaultStore] allHistories] objectAtIndex:indexPath.row];
[cell setDataFromModel:history];
return cell;

Добавление кода кнопки:

if(withCallBtn == YES) {
        callBtn = [[UIButton alloc] initWithFrame:CGRectZero];
        callBtn.tag = CALL_BUTTON_TAG;
        [callBtn addTarget:self action:@selector(callBtnAction:) forControlEvents:UIControlEventTouchUpInside];

        // setting background, title, etc

        [self.contentView addSubview:callBtn];
        [callBtn release];
    }

Привет, Адам

1 Ответ

2 голосов
/ 14 марта 2012

Ваша кнопка удерживается ее суперпредставлением, и когда вы удаляете ее из вида, она освобождается.Вам нужно сохранить его ДО того, как вы вызовете removeFromSuperview, если хотите сохранить его (в противном случае продолжайте и установите его равным nil, чтобы вы не ссылались на него снова после его освобождения).

Поэтому яизменил бы ваш код на это:

if(callBtn != nil) {
    [callBtn removeFromSuperview];
    callBtn = nil;
}

Если вы действительно хотите сохранить ссылку (что не соответствует исходному коду), вы должны использовать это:

if(callBtn.superview != nil) {
    [callBtn retain];
    [callBtn removeFromSuperview];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...