iOS11下UITableView側滑刪除詳解
阿新 • • 發佈:2019-02-07
說到編輯模式我們一般會用這個.更老的基本上沒人會用到了.所以就不提了
// 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.
這個方法和上面的方法唯一的不同就是trailing
和leading
.trailing是在後頭拉出,也就是11之前的那種預設編輯模式.trailing是前面拉出.也就是iOS11新出的前面拉動.也就是從左往右拉出cell左邊的action.
注因為是iOS11支援的API.所以舊的建議也寫上(工程支援在iOS11以上的就無視我建議吧)