Определение текущего состояния ячейки
Я знаю, что подкласс 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")
}
}