SwiftUI菜单中NavigationLink跳转uploadPostView报错求助
问题分析与解决
你遇到的Tab索引错误,核心原因是NavigationLink的初始化参数搞反了,而且没必要在NavigationLink里嵌套Button——NavigationLink本身就可以作为可点击的导航控件,直接自定义它的样式就行。
错误代码的问题
你原来的写法:
NavigationLink(uploadPostView()) { Button("post to social ") { } // ...样式修饰 }
这里把目标视图uploadPostView()放在了NavigationLink的第一个参数(label位置),而把点击的按钮放在了第二个参数(destination位置),完全搞反了参数顺序,导致SwiftUI无法正确解析导航结构,进而触发索引错误。
修正方案
直接使用NavigationLink的正确初始化方式,把目标视图作为destination,把按钮的样式作为label(甚至可以不用Button,直接用Text加样式):
修正后的上传按钮代码
HStack { Spacer() NavigationLink(destination: uploadPostView()) { Text("post to social ") .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() .padding(.bottom, 40) } }
如果一定要保留Button的点击逻辑(比如跳转前做额外操作),可以用NavigationLink结合isActive绑定:
@State private var isUploadViewActive = false // ... HStack { Spacer() Button("post to social ") { // 这里可以加跳转前的逻辑 isUploadViewActive = true } .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() .padding(.bottom, 40) .background( NavigationLink(destination: uploadPostView(), isActive: $isUploadViewActive) { EmptyView() } .hidden() ) }
完整修正后的视图代码
import SwiftUI struct userMenuView: View { @Environment(\.dismiss) var dismiss @StateObject var viewModel: userMenuViewModel // 若用isActive方式,添加这个状态变量 // @State private var isUploadViewActive = false init(user: User) { self._viewModel = StateObject(wrappedValue: userMenuViewModel(user: user)) } var body: some View { NavigationView { VStack { // toolbar VStack { HStack { Spacer() Spacer() Button("Close") { dismiss() } .foregroundColor(.black) .fontWeight(.semibold) } .padding(.horizontal) Divider() } Spacer() // Buttons underneath the header VStack { HStack { Spacer() Button(" ") { // Handle Button A action } .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() .padding(.bottom, 40) } // 修正后的上传按钮 HStack { Spacer() NavigationLink(destination: uploadPostView()) { Text("post to social ") .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() .padding(.bottom, 40) } } HStack { Spacer() Button(" ") { // Handle Button B action } .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() .padding(.bottom, 40) } HStack { Spacer() Button(" ") { // Handle Button C action } .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() .padding(.bottom, 40) } HStack { Spacer() Button(" ") { // Handle Button C action } .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() .padding(.bottom, 40) } HStack { Spacer() Button(" ") { // Handle Button A action } .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() .padding(.bottom, 40) } HStack { Spacer() Button("sign out ") { AuthService.shared.signout() } .foregroundColor(.black) .font(.custom("AvenirNextCondensed-MediumItalic", size: 32)) .bold() } } .padding(.bottom, 30) } .background( Image("userm") .resizable() .scaledToFill() .edgesIgnoringSafeArea(.all) ) } } }
补充说明
其他页面能用是因为可能用了正确的NavigationLink写法,而这里的错误写法导致NavigationLink内部的控件层级混乱,SwiftUI的导航栈无法正确识别索引,从而抛出错误。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

