1. 程式人生 > >iOS11下UITableView側滑刪除詳解

iOS11下UITableView側滑刪除詳解

說到編輯模式我們一般會用這個.更老的基本上沒人會用到了.所以就不提了

// Use -tableView:trailingSwipeActionsConfigurationForRowAtIndexPath: instead of this method, which will be deprecated in a future release.
// This method supersedes -tableView:titleForDeleteConfirmationButtonForRowAtIndexPath: if return value is non-nil
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;

但是在iOS11上.側滑返回多了一個可以滑動到頂然後觸發第一個action的功能.那麼,我們如何才能禁止這個側滑刪除呢.
其實看我貼上過來的註釋也十分的明瞭了.

注意下面這個方法是iOS11以上支援的

- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);

下面是使用舉例
這是之前咱們的程式碼

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"action1" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {

    }];
    UITableViewRowAction *action2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"action2" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {

    }];
    return @[action1 ,action2];
}

側滑到頂的時候肯定是激活了action1

- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) {
    UIContextualAction *action1 = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:@"action1" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {

    }];
    UIContextualAction *action2 = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"action2" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {

    }];
    UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[action1 ,action2]];
    config.performsFirstActionWithFullSwipe = NO;
    return config;
}

當設定performsFirstActionWithFullSwipe為YES的時候就是允許側滑刪除.當設定為NO的時候只能單擊Action來刪除

到這裡就結束了麼?沒,我們看看他旁邊的一個方法

// Swipe actions
// These methods supersede -editActionsForRowAtIndexPath: if implemented
// return nil to get the default swipe actions
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);

呃,如果實現了這個方法,如果return nil的話就是預設的側滑的action.
這個方法和上面的方法唯一的不同就是trailingleading.trailing是在後頭拉出,也就是11之前的那種預設編輯模式.trailing是前面拉出.也就是iOS11新出的前面拉動.也就是從左往右拉出cell左邊的action.

因為是iOS11支援的API.所以舊的建議也寫上(工程支援在iOS11以上的就無視我建議吧)