Определение текущего состояния ячейки

Я знаю, что подкласс UITableViewCell может реализовать willTransitionToState и выполнить пользовательский код во время перехода. Но есть ли способ найти текущее состояние ячейки?

Если нет, должен ли я подкласс UITableViewCell и определить свойство currentState, которое я всегда обновляю в своем willTransitionToState? Тогда у меня всегда будет возможность узнать состояние какой-либо конкретной ячейки.

Кажется странным, что я не могу спросить ячейку, каково ее текущее состояние (0, 1, 2 или 3).

Ответ 1

Текущие состояния: UITableViewCellStateDefaultMask (0), UITableViewCellStateShowingEditControlMask (1), UITableViewCellStateShowingDeleteConfirmationMask (2) и UITableViewCellStateShowingEditControlMask | UITableViewCellStateShowingDeleteConfirmationMask (3).

Эти состояния соответствуют значениям свойств editing и showingDeleteConfirmation. Его можно протестировать следующим образом:

if (!cell.editing && !cell.showingDeleteConfirmation) {
    // 0 - UITableViewCellStateDefaultMask
} else if (cell.editing && !cell.showingDeleteConfirmation) {
    // 1 - UITableViewCellStateShowingEditControlMask
} else if (!cell.editing && cell.showingDeleteConfirmation) {
    // 2 - UITableViewCellStateShowingDeleteConfirmationMask
} else if (cell.editing && cell.showingDeleteConfirmation) {
    // 3 - UITableViewCellStateShowingEditControlMask | UITableViewCellStateShowingDeleteConfirmationMask
}

Ответ 2

Для iOS 6 здесь мое решение:

Работает для любого из состояний перехода и обрабатывает салфетки для удаления жеста. Поместите этот код в свой подкласс UITableviewCell.

- (void)willTransitionToState:(UITableViewCellStateMask)state {

    [super willTransitionToState:state];

    if (state == UITableViewCellStateDefaultMask) {

        NSLog(@"Default");
        // When the cell returns to normal (not editing)
        // Do something...

    } else if ((state & UITableViewCellStateShowingEditControlMask) && (state & UITableViewCellStateShowingDeleteConfirmationMask)) {

        NSLog(@"Edit Control + Delete Button");
        // When the cell goes from Showing-the-Edit-Control (-) to Showing-the-Edit-Control (-) AND the Delete Button [Delete]
        // !!! It important to have this BEFORE just showing the Edit Control because the edit control applies to both cases.!!!
        // Do something...

    } else if (state & UITableViewCellStateShowingEditControlMask) {

        NSLog(@"Edit Control Only");
        // When the cell goes into edit mode and Shows-the-Edit-Control (-)
        // Do something...

    } else if (state == UITableViewCellStateShowingDeleteConfirmationMask) {

        NSLog(@"Swipe to Delete [Delete] button only");
        // When the user swipes a row to delete without using the edit button.
        // Do something...
    }
}

Ответ 3

Быстрая версия jhilgert00 с применением комментария Нила:

override func willTransitionToState(state: UITableViewCellStateMask) {

    super.willTransitionToState(state)

    if (state == UITableViewCellStateMask.DefaultMask) {
        println("default")
    } else if (state & UITableViewCellStateMask.ShowingEditControlMask != nil)
        && (state & UITableViewCellStateMask.ShowingDeleteConfirmationMask != nil) {
            println("Edit Control + Delete Button")
    } else if state & UITableViewCellStateMask.ShowingEditControlMask != nil {
        println("Edit Control Only")
    } else if state & UITableViewCellStateMask.ShowingDeleteConfirmationMask != nil {
        println("Swipe to Delete [Delete] button only")
    }
}

Ответ 4

Начиная с swift 3, значение состояния является OptionSet, вы можете использовать его следующим образом:

override func willTransitionToState(state: UITableViewCellStateMask) {
    super.willTransitionToState(state)
    if state.contains(.DefaultMask) {
        print("DefaultMask")
    }
    if state.contains(.ShowingEditControlMask) {
        print("ShowingEditControlMask")
    }
}