侧边栏壁纸
博主头像
钱学超博主等级

火星人,1万小时法则的忠实拥趸。技术宅,象棋和羽毛球爱好者,马拉松PB成绩:4小时零8分。坚持认为算法是计算机的灵魂。喜欢解决问题,喜欢手工,喜欢与朋友们聊天喝酒吹牛X。

  • 累计撰写 81 篇文章
  • 累计创建 447 个标签
  • 累计收到 88 条评论
标签搜索

目 录CONTENT

文章目录

swift导航莫名其妙弹出子页面的诡异问题

钱学超
2023-03-17 / 0 评论 / 0 点赞 / 298 阅读 / 1,002 字 / 正在检测是否收录...
  1. 使用swiftui制作app,导航使用NavigationView进行页面跳转的控制。
  2. 跳转元素使用NavigationLink作为锚点进行页面跳转。
  3. 遇到一个诡异的子页面被弹出问题。
  4. 类似于聊天工具,首页有4个tab栏,有个消息栏,展示会话列表,点进去是聊天记录详情页。还有个通讯录页面,展示组织机构,机构中有子机构也可能有用户数据。点击用户数据显示用户详情。从用户详情可以点击聊天进入聊天记录详情页面。
  5. 开始发现的问题是,在机构中点击用户详情进入聊天记录页面时,每发一次消息,就会导致聊天记录页面被自动弹出。
  6. 现在的这个描述不太准确,开始的时候,以为是机构列表中设置的某些变量发生了变化,导致了父页面刷新,从而导致子页面消失不见了。按照这个方向研究了一天,没有找到问题。
  7. 然后再进行详细测试的时候发现,如果app启动不进入会话列表页(消息Tab)的话,即便是从联系人列表里边点进去用户详情,再进入聊天页面,也不会出现这个问题。
  8. 再然后发现,即便是进入了用户详情,不进入聊天页面,此时如果app接收到了一条新信息,用户详情页也会被弹出(会话列表监听了新消息数据)
  9. 所以定位问题一直就是聊天的会话列表页(聊天页可以不进去,同样会出问题)以及组织机构列表页面,因为弹出的页面最后留下的是这个页面。
  10. 再后来就更诡异的发现,如果组织机构列表页点击了任何一个项目,进入哪怕是用户详情页或者一个空白页面,接收到新消息的时候,组织机构列表页也会刷新页面。导致刷新页面的元素是@self,@identity,_searchText。而这几个项目,是不可能发生变化的。
  11. 这里补充一下,可以使用Self._printChanges()方法打印当前页面刷新的原因。当然,必须在body的闭包里边打印,而且要用个let _ = Self._printChanges()的形式,否则打印返回的结果不是个View也不行。
  12. 诡异的问题继续,组织机构列表页,如果没有弹出任何新页面的时候,不管接收到多少条新消息,页面都不会进行刷新。
  13. 查找问题在百度上没有任何线索,当然你可以说我的关键字没有写对。
  14. 最终还是科学救了我,谷老大找到了解决方案,关键词是:SwiftUI: NavigationLink pops back when variable is updated 。
  15. 记录一下解决方案:I had the same problem and managed to solve it today. Try adding the option .navigationViewStyle(.stack) to your NavigationView
struct ContentView: View {
    var body: some View {
        NavigationView {
            //All your content and navigation links
        }.navigationViewStyle(.stack)
    }
}
  1. 经过我的测试,以上方法真实有效。但是无法佐证为什么会这样,也没办法找到其他解决方案。当然,也解释不了类似的其他的页面为啥就不会弹出子页面,哪怕是列表页,也不会弹出其子页面。
  2. 这就是闭源的原因,找不到源码,谁也找不到原因。强大的OC就不会有这种诡异问题。新手入坑的话,还是建议学OC吧。解释不了的东西,这辈子也记不住,哎。记录在这里,备查。
0

评论区