You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apple Watch中SwiftUI第三级视图导航标题不更新及渲染异常原因排查

Apple Watch SwiftUI三级导航问题排查

问题描述

我编写了一个包含三级视图的SwiftUI示例代码,在Apple Watch上运行时遇到两个问题:

  • 导航到第三级视图时,导航标题未更新为"Third",仍显示上一级的"Second"
  • 下拉第二级列表时,出现视图渲染异常(列表内容显示错位)

示例代码

struct Element: Identifiable {
    let id = UUID()
    let text: String
    init(text: String) {
        self.text = text
    }
}

struct FirstView: View {
    @State var elements = [Element(text: "a"), Element(text: "b")]
    var body: some View {
        NavigationView {
            List(elements) { element in
                NavigationLink {
                    SecondView()
                } label: {
                    VStack(alignment: .leading, spacing: 3, content: {
                        Text(element.text)
                            .font(.system(size: 12))
                            .foregroundColor(.white)
                    })
                }
            }
            .navigationTitle("First")
        }
    }
}

struct SecondView: View {
    @State var elements = [Element(text: "1"), Element(text: "2")]
    var body: some View {
        NavigationView {
            List(elements) { element in
                NavigationLink {
                    ThirdView()
                } label: {
                    VStack(alignment: .leading, spacing: 3, content: {
                        Text(element.text)
                            .font(.system(size: 12))
                            .foregroundColor(.white)
                    })
                }
            }
            .navigationTitle("Second")
        }
    }
}

struct ThirdView: View {
    @State var elements = [Element(text: "+"), Element(text: "-")]
    var body: some View {
        NavigationView {
            List(elements) { element in
                NavigationLink {
                    SecondView()
                } label: {
                    VStack(alignment: .leading, spacing: 3, content: {
                        Text(element.text)
                            .font(.system(size: 12))
                            .foregroundColor(.white)
                    })
                }
            }
            .navigationTitle("Third")
        }
    }
}

问题原因

核心错误是每个视图都重复嵌套了NavigationView。在Apple Watch的SwiftUI导航体系中,应该遵循以下规则:

  • 仅在根视图(这里是FirstView)中添加一个NavigationView作为导航容器
  • 所有子视图(SecondView、ThirdView)无需再包裹NavigationView,直接通过NavigationLink跳转即可

重复嵌套NavigationView会导致导航栈层级混乱,系统无法正确识别当前视图的导航标题,同时会干扰列表的布局计算,引发下拉时的渲染异常。

修正后的代码

struct Element: Identifiable {
    let id = UUID()
    let text: String
    init(text: String) {
        self.text = text
    }
}

struct FirstView: View {
    @State var elements = [Element(text: "a"), Element(text: "b")]
    var body: some View {
        NavigationView {
            List(elements) { element in
                NavigationLink {
                    SecondView()
                } label: {
                    VStack(alignment: .leading, spacing: 3) {
                        Text(element.text)
                            .font(.system(size: 12))
                            .foregroundColor(.white)
                    }
                }
            }
            .navigationTitle("First")
        }
    }
}

struct SecondView: View {
    @State var elements = [Element(text: "1"), Element(text: "2")]
    var body: some View {
        List(elements) { element in
            NavigationLink {
                ThirdView()
            } label: {
                VStack(alignment: .leading, spacing: 3) {
                    Text(element.text)
                        .font(.system(size: 12))
                        .foregroundColor(.white)
                }
            }
        }
        .navigationTitle("Second")
    }
}

struct ThirdView: View {
    @State var elements = [Element(text: "+"), Element(text: "-")]
    var body: some View {
        List(elements) { element in
            NavigationLink {
                SecondView()
            } label: {
                VStack(alignment: .leading, spacing: 3) {
                    Text(element.text)
                        .font(.system(size: 12))
                        .foregroundColor(.white)
                }
            }
        }
        .navigationTitle("Third")
    }
}

修正效果

  • 第三级视图的导航标题会正确显示为"Third"
  • 下拉第二级列表时,视图渲染恢复正常,不会出现错位问题

内容的提问来源于stack exchange,提问作者kunass2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:15:47