Determining the current state of a cell

前端 未结 4 1469
孤独总比滥情好
孤独总比滥情好 2021-02-01 10:01

I know that a subclass of UITableViewCell can implement willTransitionToState and execute custom code at the time of transition. But is there any way t

相关标签:
4条回答
  • 2021-02-01 10:21

    The current states are UITableViewCellStateDefaultMask (0), UITableViewCellStateShowingEditControlMask (1), UITableViewCellStateShowingDeleteConfirmationMask (2), and UITableViewCellStateShowingEditControlMask | UITableViewCellStateShowingDeleteConfirmationMask (3).

    These states correspond to the values of the properties editing and showingDeleteConfirmation. It can be tested as follows:

    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
    }
    
    0 讨论(0)
  • 2021-02-01 10:28

    The swift version of jhilgert00 with Neil's comment applied:

    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")
        }
    }
    
    0 讨论(0)
  • 2021-02-01 10:28

    Starting from swift 3 the value of state is an OptionSet, you can use it like this:

    override func willTransitionToState(state: UITableViewCellStateMask) {
        super.willTransitionToState(state)
        if state.contains(.DefaultMask) {
            print("DefaultMask")
        }
        if state.contains(.ShowingEditControlMask) {
            print("ShowingEditControlMask")
        }
    }
    
    0 讨论(0)
  • 2021-02-01 10:37

    For iOS 6, here's my solution:

    Works for any of the transition states AND handles the swipe to delete gesture as well. Place this code in your subclass of 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's 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...
        }
    }
    
    0 讨论(0)
提交回复
热议问题