Ответ Ставаша лучший, но если вы не хотите этого делать, вы также можете использовать tableView: cellForRowAtIndexPath:
. Я видел, что вы пробовали это и что состояние кнопки было потеряно во время прокрутки. Я предполагаю, что это связано с повторным использованием клеток. При повторном использовании ячеек, как только ячейка просмотра таблицы выходит из экрана, она кэшируется с идентификатором, а затем следующая ячейка, которая появляется на экране, извлекает ячейку с заданным идентификатором из кеша.
Чтобы избежать нажатия кнопки при ее выключении, вы можете использовать несколько идентификаторов повторного использования и сохранять состояния ваших кнопок в массиве. Мы назовем это свойство buttonStates
(он должен быть изменчивым массивом).
Инициализируйте переменную buttonStates
и добавьте строки для представления «базовых состояний». Добавьте столько строк, сколько количество ячеек в вашей таблице (я предполагаю, что на вашем коде есть только один раздел).
Когда состояние изменяется (это, вероятно, произойдет в вашем методе copyPressedFromCell:
), обновите объект по индексу тега кнопки (который вы уже установили в индекс ячейки) со строкой, представляющей новое состояние.
Со всем этим сделайте так, чтобы ваш метод cellForRowAtIndexPath:
выглядел следующим образом:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *CellIdentifier = self.buttonStates[indexPath.row];
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
Прежде чем продолжить, давайте взглянем на некоторые из вашего кода willDisplayCell:
(который следует переместить здесь).
UIImageView *cellBottomLine = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, CELL_HEIGHT, 320.0, 1)];
cellBottomLine.image = [UIImage imageNamed:@"bottomCellImage.png"];
if (cellBottomLine.subviews) {
[cell addSubview:cellBottomLine];
}
Почему вы используете этот оператор if? Если вы только что создали новое представление изображения, оно будет возвращать YES
каждый раз (при условии, что массив subviews по умолчанию не является nil
). Вы предпочли бы проверить, существует ли изображение нижней ячейки в подзонах соты. Но нам даже этого не нужно. Просто добавьте изображение в метод cellForRowAtIndexPath:
, внутри ! Cell
if. Таким образом, мы добавим bottomCellImage
, если ячейка еще не создана.
То же самое можно сказать о вызове if (! CopyButton.superview)
. Продолжая, где мы находимся в нашем методе cellForRowAtIndexPath:
:
UIImageView *cellBottomLine = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, CELL_HEIGHT, 320.0, 1)];
cellBottomLine.image = [UIImage imageNamed:@"bottomCellImage.png"];
[cell addSubview:cellBottomLine];
copyButton = [BSFunctions createButtonWithNormalImageNamed:@"copyCellButton.png"
highlightedImageName:@"copyCellButtonPressed.png"
target:self
selector:@selector(copyPressedFromCell:)];
[copyButton setFrame:CGRectMake(250, 10, 62, 32.5)];
copyButton.tag = indexPath.row;
[cell addSubview:copyButton];
}
UIButton *button = [cell viewWithTag:indexPath.row];//Get the copy button
//Update the state of the button here based on CellIdentifier, outside the if statement so that it gets updated no matter what
//Also configure your cell with any non-button related stuffs here
return cell;
}