SwiftUI中从List推送视图控制器

vi4fp9gy  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(54)

我正在学习SwiftUI
在此期间,我已经创建了一个选项卡视图,其中有4个选项卡,其中在最后一个选项卡,有一个列表,其中有以下数组

struct NavItem {
    let id: String
    let text: String
}

struct ServicesView: View {

    @State private var listItems: [NavItem] = [NavItem(id: "1", text: "Profile"),
                                                      NavItem(id: "2", text: "Leave"),
                                                      NavItem(id: "3", text: "How to use"),
                                                      NavItem(id: "4", text: "About Us"),
                                                   NavItem(id: "5", text: "Logout")]

字符串
使用LIST我能够显示相同的视图正确,唯一的问题,我面临的是我不能推动新的选择任何项目

var body: some View {

                NavigationView {
                    List (selection: $selection) {
                                ForEach(listItems, id:\.id) { item in
                                    Button(action: {
                                        if(item.id == "1"){
                                            print("navigate to ----> " + item.text)
                                            NavigationLink(destination: ProfileView()) {
                                                Text("Show Detail View")
                                            }
                                        }
                                    }) {
                                        Text(item.text)
                                            .foregroundStyle(.black)
                                    }
                                    .padding(10)
                                    .listRowInsets(.init(top: 0,leading: -5, bottom: 0, trailing: -5))
                                    .frame(minWidth: 111, idealWidth: .infinity, maxWidth: .infinity, alignment: .leading)
                                    .tag(item.id)
                                    .background(Color.clear)
                                }
                            }
                }
}


当我在LIST中添加navigationLink时,它会给我下面这样的警告,

Result of 'NavigationLink<Label, Destination>' initializer is unused


我可以在控制台上打印,但我的列表无法导航到Profileview。
任何人都可以请帮助我了解我做错了什么。任何帮助将不胜感激。
先谢了。

syqv5f0l

syqv5f0l1#

NavigationLink表示一种视图,当你把它放在Button action中时,它不是一个要执行的函数。你必须把它带出闭包。

更新内容:ProfileView的推流动作有触发条件,所以这是一个技巧:

@State private var isActive: Bool = false
...
NavigationView {
    List {
        ForEach(listItems, id:\.id) { item in
            Button {
                isActive = item.id == "1"
            } label: {
                Text(item.text)
                    .foregroundStyle(.black)
            }
        }
    }
    .background {
        NavigationLink(destination: ProfileView(), isActive: isActive) {
            EmptyView()
        }
        .hidden()
    }
}

字符串

注意NavigationView已弃用,您可以考虑使用NavigationStack

@State private var path: NavigationPath = .init()
...
NavigationStack(path: $path) {
    List {
        ForEach(listItems, id:\.id) { item in
            Button {
                if item.id == "1" {
                    path.append(item)
                }
            } label: {
                Text(item.text)
                    .foregroundStyle(.black)
            }
        }
    }
    .navigationDestination(for: NavItem.self) { item in
        ProfileView()
    }
}

相关问题