异步调用后端API后生成可重排MultivaluedSection表单,重排控件不显示求助
我最近碰到了个头疼的问题:通过异步调用后端API生成带可重排MultivaluedSection的表单时,表单能正常展示,但重排控件完全没出现;可要是去掉异步逻辑,直接同步生成表单,重排控件就显示得好好的。试了好几种办法都没搞定,想请大伙帮忙支支招。
复现代码
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { self.test() } func test() { // 生成包含可重排Section的表单逻辑 let section = MultivaluedSection( header: "可重排列表", footer: "", items: [ MultivaluedItem(title: "项目1", value: ""), MultivaluedItem(title: "项目2", value: "") ], multivaluedOptions: [.Reorder] ) self.form = Form(sections: [section]) }
注:如果去掉
Dispatch延迟调用test(),表单就能正常渲染出重排控件。
可能的解决方向
我之前也碰到过类似的UI更新时机问题,给你几个实操性的思路:
显式触发表单UI刷新
异步回调里光给form赋值,有时候可能触发不了UI的重新渲染。你可以在test()方法最后,手动调用表单的刷新方法——如果是用Eureka库的话,加一句self.form.reload();如果是自己维护tableView,就调用self.tableView.reloadData(),强制UI更新。确认重排选项未丢失
异步生成Section时,偶尔会因为参数传递或者逻辑疏漏,导致multivaluedOptions里的.Reorder选项被漏掉。可以在赋值form前打印一下section.multivaluedOptions,确认重排选项确实存在。确保数据源完全就绪
检查API返回的数据是不是在解析完成后才传入Section。要是数据还没处理完就生成Section,items可能是空的,重排控件自然不会显示。可以在test()里先打印items的数量,确认数据没问题。强制刷新tableView布局
有些情况下,光调用reloadData可能不够,你可以试试在赋值form后,手动调用self.tableView.beginUpdates()和self.tableView.endUpdates(),让tableView强制刷新布局,重排控件大概率就会出现了。
修改后的示例代码
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { self.test() } func test() { let section = MultivaluedSection( header: "可重排列表", footer: "", items: [ MultivaluedItem(title: "项目1", value: ""), MultivaluedItem(title: "项目2", value: "") ], multivaluedOptions: [.Reorder] ) self.form = Form(sections: [section]) // 手动触发UI刷新 self.tableView.reloadData() // Eureka框架可用:self.form.reload() }
内容的提问来源于stack exchange,提问作者gplocke

