SwiftUI的tabview非常好用,简单几行就能构建一套基于Tab的App。但是SwiftUI目前tabview存在一个小bug,当tab切换时内部中的list或NavigationLink将会重新刷新。

看看bug

当我们切换到新的tab时,第一个tab被重置回初始状态了。

这个bug可以修复么

我们有两种解决方案,一种等6月份等WWDC新版发布,修复这个bug。另外就是自己动手封装一个tabview

实战解决

1、测试页面

import SwiftUIstruct ExampleView: View {@State var text: String = ""var body: some View {UIKitTabView([UIKitTabView.Tab(view: NavView(), title: "首页", image: "phone32.png"),UIKitTabView.Tab(view: Text("Second View"), title: "其他", image: "")])}
}struct NavView: View {var body: some View {NavigationView {VStack {NavigationLink(destination: Text("您能看到这个页面,则证明bug修复")) {Text("显示详细页")}}}}
}

2、封装个UIkitTabview

struct UIKitTabView: View {var viewControllers: [UIHostingController<AnyView>]@State var selectedIndex: Int = 0init(_ views: [Tab]) {self.viewControllers = views.map {let host = UIHostingController(rootView: $0.view)host.tabBarItem = $0.barItemreturn host}}var body: some View {TabBarController(controllers: viewControllers, selectedIndex: $selectedIndex).edgesIgnoringSafeArea(.all)}struct Tab {var view: AnyViewvar barItem: UITabBarIteminit<V: View>(view: V, barItem: UITabBarItem) {self.view = AnyView(view)self.barItem = barItem}// convenienceinit<V: View>(view: V, title: String?, image: String, selectedImage: String? = nil) {let selectedImage = selectedImage != nil ? UIImage(named: selectedImage!) : nillet barItem = UITabBarItem(title: title, image: UIImage(named: image), selectedImage: selectedImage)self.init(view: view, barItem: barItem)}}
}

3、制作一个TabBarController

import SwiftUI
import UIKitstruct TabBarController: UIViewControllerRepresentable {var controllers: [UIViewController]@Binding var selectedIndex: Intfunc makeUIViewController(context: Context) -> UITabBarController {let tabBarController = UITabBarController()tabBarController.viewControllers = controllerstabBarController.delegate = context.coordinatortabBarController.selectedIndex = 0return tabBarController}func updateUIViewController(_ tabBarController: UITabBarController, context: Context) {tabBarController.selectedIndex = selectedIndex}func makeCoordinator() -> Coordinator {Coordinator(self)}class Coordinator: NSObject, UITabBarControllerDelegate {var parent: TabBarControllerinit(_ tabBarController: TabBarController) {self.parent = tabBarController}func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {parent.selectedIndex = tabBarController.selectedIndex}}
}

技术交流

QQ:3365059189 SwiftUI技术交流QQ群:518696470

  • 请关注我的专栏icloudend, SwiftUI教程与源码 https://www.jianshu.com/c/7b3e3b671970

不刷新页面的tab_SwiftUI小技巧之如何解决Tab切换后页面重置和List刷新bug相关推荐

  1. Web前端笔记-解决NicSroll使用后页面跳动(每次刷新或进入跳动一下然后正常)问题

    我的是这样的页面 头部和尾部不动,就中间动.但每次刷新时会先出现这个. 然后页面跳动下,就正常了,很奇怪的体验,对应的代码如下: <head>.........<script> ...

  2. IOS小技巧–用runtime 解决UIButton 重复点击问题

    IOS小技巧–用runtime 解决UIButton 重复点击问题 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我 ...

  3. 三星s6老显示无服务器,三星手机最常见的故障和修复小技巧助你解决难题

    三星手机最常见的故障和修复小技巧助你解决难题 三星的Galaxy系列手机是市场上最好的设备之一.就像所有高端移动技术一样,随着软件和硬件的老化,你最终会遇到某种问题.本指南将向您介绍如何解决三星Gal ...

  4. 微信H5页面,返回上一页面后页面不会自动刷新

    最近在做微信公众号中的功能,有发现一个问题,就是微信H5页面中,有时候返回上一页后页面不会自动刷新,这样子就有可能造成页面数据更新不及时 在网上搜索后发现一个解决办法,使用window监听pageSh ...

  5. 不刷新页面的tab_现代 Web 页面开发流程

    通常来说,Web页面开发的流程大致是这样的:设计师(设计师不是美工,就像程序员不是码农一样)提供设计稿,通常是图片格式.然后前端的开发人员(在ThoughtWorks我们称之为UI Dev)来手工的将 ...

  6. java中刷新页面的js,[Java教程]js页面刷新之实现框架内外刷新(整体、局部)

    [Java教程]js页面刷新之实现框架内外刷新(整体.局部) 0 2016-10-12 12:00:56 这次总结的是框架刷新: 框架内外的按钮均可以定义网页重定向, 框架内部页面的按钮可以实现局部刷 ...

  7. wi ndows怎么自动编页,15个小技巧,让我的Windows电脑更好用了!

    原标题:15个小技巧,让我的Windows电脑更好用了! 作者:水韬呀 来源:水韬呀(id: shuitao_Ya) 小学三年级,那是我第一次接触电脑,电脑系统是老旧的Windows XP,高中时换上 ...

  8. 【演示文稿制作软件】Focusky教程 | 正文页的排版小技巧 - 留白与距离

    (Focusky动画演示大师也称为"FS软件")留白指的是每帧的内容与该帧边界之间无内容的空白. 所谓的空白,不是单指白色背景,而是指那些可以用来当作背景的颜色或者图片,它们不用来 ...

  9. 小技巧收藏之解决Word里9个常见难题

    9个技巧教你解决Word里9个常见难题 1.前言 在生活中,我们经常使用office办公软件,其中做word,基本上只要有工作的,都是需要接触到,很多时候老是有一些莫名其妙的难题,什么方框里面打勾啊, ...

最新文章

  1. 新思路等级考二级c语言题答案,2017计算机二级C语言考试强化习题及答案
  2. 屏幕广播系统_如何设计系统,而不是屏幕
  3. 解决Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.
  4. 安装包损坏无法安装怎么办?关于更新big sur系统后软件下载无法安装问题的解答
  5. SpringBoot入门-自动配置原理
  6. python+selenium,实现带有验证码的自动化登录功能
  7. Python中变量的命名以及输入输出
  8. 2019年失业以后,他们都经历了什么?
  9. CSDN文章标题名不能有%-6A这样的字串
  10. 数学建模 —— 自回归模型
  11. RP产品原型资源分享-论坛类
  12. CRS-0804:PROC-26: Error while accessing the physical storage
  13. C++性能优化(十二)——自旋锁
  14. Aseprite学习/技巧
  15. CSDN博客字体样式、字体大小、字体颜色、首行缩进调节
  16. 笔记本连接手机热点并共享网络给台式机
  17. Data + AI Summit 2022 超清视频下载
  18. C语言例题:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
  19. Linux中存储设备的命名规则
  20. 前天在腾讯soso问问上别人问我raid问题?

热门文章

  1. Directx11教程(18) D3D11管线(7)
  2. 重提URL Rewrite(3):在URL Rewrite后保持PostBack地址(转老赵blog)
  3. Selenium无法点击元素,报错:ElementClickInterceptedException:element click intercepted
  4. .NET UIAutomation实现Word文档加密暴力破解
  5. 在阿里云里申请免费Https证书SSL
  6. Spring EL hello world实例
  7. Spring依赖检查
  8. 腾讯地图api如何根据地址获取经纬度
  9. 微信web开发者工具调试
  10. composer 完整路径才能访问_一份完整的运营方案策划思路,拿走不谢(精华版)