Mac运行iPad应用时鼠标滑动删除无法触发commitEditingStyle代理问题
macOS运行Designed for iPad应用UITableView鼠标滑动删除失效解决方案
根因说明
该问题是Designed for iPad应用适配macOS运行时的常见交互差异问题:macOS外接鼠标的横向滑动手势默认不会触发iOS传统的tableView:commitEditingStyle:forRowAtIndexPath:回调,系统对鼠标输入的滑动交互识别逻辑和iOS原生触控逻辑存在差异。
适配方案
方案1:使用官方推荐的滑动操作代理(优先选择,iOS 11+支持)
苹果在iOS 11推出的tableView:trailingSwipeActionsConfigurationForRowAtIndexPath:代理已适配macOS的鼠标滑动交互,是该场景的最优实现方案,替换原有老代理即可:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { UIContextualAction *deleteAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:NSLocalizedString(@"删除", @"") handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { // 原有删除逻辑直接迁移到此处 if (![self.info rightGranted:self.user_app_id :4 :self.rights_list]) { [General showAlert:NSLocalizedString(@"no_delete_rights", @"") :NSLocalizedString(@"do_not_have_delete_rights", @"") :NSLocalizedString(@"ok", @"") :self]; [self.tableView reloadData]; completionHandler(NO); return; } [General promptAbandonChanges:self :NSSelectorFromString(@"deleteUserConfirm2:") :NSLocalizedString(@"confirm_delete_user", @"") :NSLocalizedString(@"delete_user_alert", @"") :self :(NSObject *)indexPath]; completionHandler(YES); }]; return [UISwipeActionsConfiguration configurationWithActions:@[deleteAction]]; }
方案2:新增右键删除菜单(符合Mac用户使用习惯)
Mac用户更习惯右键呼出操作菜单,可额外实现上下文菜单代理进一步提升适配体验:
- (UIContextMenuConfiguration *)tableView:(UITableView *)tableView contextMenuConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath point:(CGPoint)point { return [UIContextMenuConfiguration configurationWithIdentifier:nil previewProvider:nil actionProvider:^NSArray * _Nullable(NSArray<UIMenuElement *> * _Nonnull suggestedActions) { UIAction *deleteAction = [UIAction actionWithTitle:NSLocalizedString(@"删除", @"") image:[UIImage systemImageNamed:@"trash"] identifier:nil handler:^(UIAction * _Nonnull action) { // 执行对应删除逻辑 }]; deleteAction.attributes = UIMenuElementAttributesDestructive; return [UIMenu menuWithChildren:@[deleteAction]]; }]; }
方案3:兼容旧系统的自定义手势实现
如果需要支持iOS 11以下系统,可以手动给UITableViewCell添加UISwipeGestureRecognizer,识别横向滑动手势后主动触发删除逻辑,需要实现手势代理方法gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:返回YES,避免和系统自带手势产生冲突。
注意事项
- 迁移到新代理后可移除原有
tableView:commitEditingStyle:forRowAtIndexPath:中的删除逻辑,避免重复执行 - 测试时确认macOS系统偏好设置中未关闭对应APP的手势控制权限
内容的提问来源于stack exchange,提问作者PDG
相关产品推荐
相关产品推荐

