Подтвердить что ты не робот

Как определить режим редактирования на iPhone UITableView

Для моего приложения для iPhone у меня есть редактируемое (для удаления) табличное представление. Я хотел бы быть в состоянии обнаружить, что пользователь нажал кнопку "Редактировать". Посмотрите это изображение: http://grab.by/It0

Из документов это выглядело так, как будто я реализовал:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath

тогда я мог бы это обнаружить (хотя из названия метода я бы так не подумал). Это оказалось не сработало.

Есть идеи по обнаружению этого? Причина, по которой я хочу, заключается в том, что я хочу подключить кнопку "Удалить все" в верхнем левом углу в режиме удаления.

Спасибо

4b9b3361

Ответ 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
    }
}