Xcode12 Swift5 SwiftUI中NavigationView内Form的Text分隔线如何移除?
Xcode 12 / Swift 5 环境下移除SwiftUI Form内分隔线的正确方案
原有写法失效的核心原因
- 配置时序不对:在单个页面的
init里修改UITableView.appearance()时,Form底层依赖的UITableView实例往往已经完成初始化,读不到最新的外观设置,自然不生效。 - 配置项不全:只设置
separatorStyle = .none不够,iOS系统会给UITableView的分隔线预留透明渲染层、固定边距占位,单靠这一项设置没法完全把分隔线藏干净。
可落地的修复步骤
- 将全局外观配置移至App应用入口的初始化方法中,确保所有UITableView实例创建前就完成配置加载
- 补全缺失的外观配置项:将分隔线颜色设为透明、清空分隔线内边距、把Section的头部/尾部高度设为0,消除系统默认的占位区域
- 对Form内的Section做自定义头/尾替换,用空视图替代系统默认的Section头脚,去掉残留的分隔渲染区域
修正后的完整代码
首先是App入口的全局配置(Xcode12适配的SwiftUI App协议写法):
@main struct DemoApp: App { init() { let tableView = UITableView.appearance() // 关闭分隔线 tableView.separatorStyle = .none // 清除分隔线透明残留渲染 tableView.separatorColor = .clear // 基础样式配置 tableView.backgroundColor = .white // 清除Section头脚的默认占位高度 tableView.sectionHeaderHeight = .zero tableView.sectionFooterHeight = .zero // 关闭默认的可读边距,消除分隔线占位的边距残留 tableView.cellLayoutMarginsFollowReadableWidth = false } var body: some Scene { WindowGroup { ContentView() } } }
然后是ContentView的简化写法,删除原有init中的重复外观配置即可:
struct ContentView: View { var body: some View { NavigationView { Form { Section { Text("\(isbn ?? "")") Text("\(foundBooks?.items.first?.volumeInfo.line1 ?? "")") Text("\(foundBooks?.items.first?.volumeInfo.line2 ?? "")") Text("\(foundBooks?.items.first?.volumeInfo.line3 ?? "")") Text("\(foundBooks?.items.first?.volumeInfo.line4 ?? "")") Text("\(foundBooks?.items.first?.volumeInfo.line5 ?? "")") Text("\(foundBooks?.items.first?.volumeInfo.line6 ?? "")") } header: { EmptyView() } footer: { EmptyView() } } } } }
补充注意事项
- 上述的全局配置会作用于App内所有用到Form、List组件的页面。如果只需要在当前页面生效分隔线隐藏效果,可以把外观配置移到页面的
onAppear回调里,在onDisappear里把UITableView的外观改回系统默认,避免打乱其他页面的原有样式。 - iOS14(对应Xcode12的系统适配范围)下仅设置
separatorStyle = .none大概率会残留半透明的分隔线痕迹,必须搭配separatorColor = .clear才能彻底消除。
内容的提问来源于stack exchange,提问作者Jintor
相关产品推荐
相关产品推荐

