有没有办法在 SwiftUI 上使用 NavigationLink() 转到随机视图?

问题描述 投票:0回答:2

我正在尝试使用 NavigationLink() 按钮转到四个视图之一,并且我希望它是随机的。

我尝试使用随机变量和 switch 函数,但事实证明我无法修改 NavigationLink() 按钮内的变量(它给了我这个错误:类型 '()' 无法符合 'View'),就像我一样会在一个普通的按钮中。这就是我得到的:

导入 SwiftUI

结构ContentView:视图{ @State var valore = Int.random(in: 1...4)

var body: some View {
    NavigationStack {
        NavigationLink {
            switch valore {
            case 1:
                ContentView1()
            case 2:
                ContentView2()
            case 3:
                ContentView3()
            case 4:
                ContentView4()
            default:
                ContentView()
            }
            } label: {
                Image("Retro")
                    .resizable()
                    .cornerRadius(27.0)
                    .aspectRatio(contentMode: .fit)
                    .padding()
            }
        Text("\(valore)")
            .bold()
            .font(.title)
    }
}

} 我想“重新随机化”每个案例中的变量“valore”,以便当它返回时数字已经改变,因此它将进入下一个视图。

swift swiftui swiftui-navigationlink
2个回答
0
投票

您可以利用属性包装器。

在您的 ContentView1...4 上,为每个视图声明一个 Binding var,如下所示:

@Binding var valore: Int

在每个 ContentView1...4 内添加一个

.onAppear
并更新其中的值:

struct ContentView1: View {
    @Binding var valore: Int
    
    var body: some View {
        VStack {
            Text("Content 1")
        }
        .onAppear {
            valore = Int.random(in: 1...4)
        }
    }
}

这将自动更改 valore 值。

您的 ContentView 应如下所示:

struct ContentView: View {
@State private var valore = Int.random(in: 1...4)

var body: some View {
    NavigationStack {
        NavigationLink {
            switch valore {
            case 1:
                ContentView1(valore: $valore)
            case 2:
                ContentView2(valore: $valore)
            case 3:
                ContentView3(valore: $valore)
            case 4:
                ContentView4(valore: $valore)
            default:
                ContentView1(valore: $valore)
            }
        } label: {
            Image("Retro")
                .resizable()
                .cornerRadius(27.0)
                .aspectRatio(contentMode: .fit)
                .padding()
        }
        Text("\(valore)")
            .bold()
            .font(.title)
    }
}

希望有帮助


-1
投票

你可以做这样的事情。我不确定这是否是您想要的,因为从技术上讲我没有使用 NavigationLink,但这使用了一个开关来转到随机视图。如果您不想点击按钮,可以设置状态值 onappear(){} 以自动导航到随机视图。

var body: some View {
        VStack {
            if valore == 0 {
                Text("Click For Random View")
                    .bold()
                    .font(.title)
                    .onTapGesture {
                        // set range to how ever many cases you have
                        myview = Int.random(in: 1...4)
                    }
            }
            switch valore {
            case 1:
                ContentView1()
            case 2:
                ContentView2()
            case 3:
                ContentView3()
            case 4:
                ContentView4()
            default:
                VStack{}
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.