Как определить режим редактирования на iPhone UITableView
Для моего приложения для iPhone у меня есть редактируемое (для удаления) табличное представление. Я хотел бы быть в состоянии обнаружить, что пользователь нажал кнопку "Редактировать". Посмотрите это изображение: http://grab.by/It0
Из документов это выглядело так, как будто я реализовал:
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
тогда я мог бы это обнаружить (хотя из названия метода я бы так не подумал). Это оказалось не сработало.
Есть идеи по обнаружению этого? Причина, по которой я хочу, заключается в том, что я хочу подключить кнопку "Удалить все" в верхнем левом углу в режиме удаления.
Спасибо
Ответы
Ответ 1
Вероятно, он не работает так, как вы ожидаете, потому что willBeginEditingRowAtIndexPath:
вызывается до начала редактирования.
Если вы хотите проверить в другом методе, вам нужно свойство editing
:
@property(nonatomic, getter=isEditing) BOOL editing
Если вы хотите что-то сделать, когда нажата кнопка "Изменить", вам нужно реализовать метод setEditing:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
Который вы найдете в UIViewController
. (Ну, это наиболее вероятное место; есть и другие.)
Swift
Используйте ниже код соответственно:
open var isEditing: Bool // default is NO. setting is not animated.
open func setEditing(_ editing: Bool, animated: Bool)
Ответ 2
При подклассификации tableviewcontroller (что большинство людей собирается делать большую часть времени с тех пор, как вы должны переопределить его методы делегирования, просто чтобы поместить в него данные...), вы можете просто переопределить метод setEditing: анимированный: редактирование изменений состояния.
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
NSLog(@"Editing %i", editing);
[super setEditing:editing animated:animated];
}
Это передает изменение состояния вместе с суперклассом, но позволяет вам прыгать посередине и обнаруживать изменение или изменять его, если вы хотите...
Ответ 3
Этот метод сообщает вам, когда пользователь редактирует ячейку, а не помещает таблицу в режим редактирования. Существует метод, который вызывается при вводе режима редактирования, чтобы спросить каждую ячейку, если она может быть отредактирована:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
Я не думаю, что переопределение setEditing:animated:
имеет смысл, так как вам придется подкласс UITableView
, который является дополнительной работой и классом, который вам нужен по какой-либо другой причине, не говоря уже о том, что ему нужно было бы сообщить о том, что редактирование был снова включен в контроллер.
Еще одна опция - просто добавить кнопку "Редактировать" самостоятельно - она построена в UIBarButtonSystemItem
, вы можете добавить ее, а затем вызвать ее собственный метод, в котором вы делаете что-то конкретное, затем наберите setEditing:animated:
на UITableView
сам.
Идея редактирования заключается в том, что, когда редактирование включено, каждой ячейке сообщается перейти в режим редактирования и спрашивать, есть ли какие-либо конкретные элементы управления, которые должны применяться. Поэтому в теории нет необходимости обнаруживать вход в режим редактирования, не изменяя внешний вид ячеек. Что вы пытаетесь сделать, когда введен режим редактирования?
Ответ 4
Ответ Кендалла работает. Я сделал это следующим образом.
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
NSLog(@"Can edit %d", tableView.editing);
if (tableView.editing == 1) {
[self.editButtonItem setTitle:EDIT_BUTTON_TITLE];
}else {
[self.editButtonItem setTitle:DONE_BUTTON_TITLE];
}
return YES;
}
Ответ 5
Примеры setEditing: animated: для меня не работали (на iOS 6.1), чтобы обнаружить изменения состояния, которые возникают при входе и выходе из режима подтверждения подтверждения. Кажется, что setEditing: анимированный: вызывается только один раз, когда представление таблицы переходит в режим редактирования, но не в состояние изменений ячеек. После некоторого удовольствия отладчика я пришел к методу обнаружения изменения состояния ячейки.
Мой вариант использования отличается от вашего. Я просто хотел скрыть ярлык, когда кнопка удаления отображается, так что содержимое другой ячейки не перекрывается, когда кнопка "Удалить" перемещается. (Я использую UITableViewCellStyleValue2, тот, у которого синяя метка слева и черная метка справа.)
(В вашем подклассе UITableViewCell)
- (void)willTransitionToState:(UITableViewCellStateMask)state {
[super willTransitionToState:state];
if (state & UITableViewCellStateShowingDeleteConfirmationMask) {
// showing delete button
[self.textLabel setAlpha:0.0f]; // <-- I just wanted to hide the label
}
}
- (void)didTransitionToState:(UITableViewCellStateMask)state {
if (!(state & UITableViewCellStateShowingDeleteConfirmationMask)) {
// not showing delete button
[self.textLabel setAlpha:1.0f]; // <-- show the label
}
}