UITableView无法显示重排控件,常规修复方案无效求助
兄弟,我太懂这种明明按常规步骤操作,结果重排控件就是不出来的崩溃感了!能看到删除控件说明编辑模式已经生效,那问题大概率出在几个容易被忽略的细节上,给你逐一排查:
必须确保
canMoveRowAtIndexPath返回YES
这个方法是重排控件显示的核心开关,哪怕你其他配置都对,只要这里返回NO(或者在某些条件下误返回NO),重排控件绝对不会出来。比如分组列表里漏了处理某个section,或者写了错误的判断逻辑。示例代码:// Objective-C - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { return YES; // 这里一定要返回YES! }// Swift func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { return true }检查
showsReorderControl的设置时机
你说已经指定了这个属性,但要确认是不是在cellForRowAtIndexPath(Swift里是cellForRowAt)里设置的,而且没有在cell复用的时候被覆盖。比如自定义cell的初始化代码里没设置,或者在willDisplayCell里被误设为NO了。正确的设置方式应该是在cell创建/复用的时候明确开启:cell.showsReorderControl = YES;cell.showsReorderControl = true别乱改
editingStyleForRowAtIndexPath的返回值
如果你手动实现了这个方法,千万别只返回UITableViewCellEditingStyleDelete!默认情况下,只要你实现了重排相关的数据源方法,系统会自动显示删除+重排控件;但如果你指定了编辑样式为纯删除,重排控件就会被隐藏。如果需要同时支持两种操作,要么不实现这个方法,让系统自动处理即可。排查自定义cell的布局问题
如果你用的是自定义cell,有没有可能是cell的contentView或者其他子视图太宽,把右侧的重排控件给挡住了?可以先换成系统的默认UITableViewCell测试,如果默认cell能显示重排控件,那就是你的自定义cell布局有问题,调整一下cell的约束或者子视图的宽度就行。静态tableView的特殊情况
要是你用的是Storyboard里的静态cell,除了要确保每个cell的showsReorderControl在属性面板里勾选了,还要记得重写canMoveRowAtIndexPath和moveRowAtIndexPath方法——别以为静态cell就不用管数据源方法了,系统还是需要这些方法来启用重排功能。别让第三方库搞破坏
如果你用了第三方的tableView子类或者分类,有些库可能会重写编辑模式的逻辑,导致重排控件被隐藏。可以暂时换成原生的UITableView测试,看看问题是否消失。
如果以上所有点都排查过还是不行,建议把你的cellForRow、重排相关的数据源方法代码贴出来,这样更容易精准定位问题!
内容的提问来源于stack exchange,提问作者mashers

