在没有导航链接的情况下更改视图 SwiftUI

Sil*_*ing 3 segue swiftui swiftui-navigationlink

我大家!我花了几个小时寻找一些我认为非常简单的东西,但我无法找到最好的方法......我有我的身体视图:

var body: some View {
        
        VStack {
            // The CircularMenu
            CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
                .buttonStyle(PlainButtonStyle())

        }
    }
Run Code Online (Sandbox Code Playgroud)

其中包含一个圆形菜单。每次单击菜单项都会调用:

func buttonClickHandler(_ index: Int) {
        /// Your actions here
        
        switch index {
        //Thermometer
        case 0:
            print("0")
        //Light
        case 1:
            print("1")
        //Video
        case 2:
            print("2")
        //Alarm
        case 3:
            print("3")
        //Car
        case 4:
            self.destinationViewType = .car
            self.nextView(destination: .car)
            
        default:
            print("not found")
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想执行一个简单的视图转换到另一个名为“汽车”的视图。nextView函数如下所示:

func nextView(destination: DestinationViewType) {
        
        switch destination {
            case .car: Car()
        }
    }
Run Code Online (Sandbox Code Playgroud)

我以为这很简单,但我Result of 'Car' initializer is unused在案例行得到:。那么有人知道如何实现这一目标?预先非常感谢!

vac*_*ama 5

这是一种方法:

创建一个包含 an和 an 的struct调用:IdentifiableViewAnyViewid

struct IdentifiableView: Identifiable {
    let view: AnyView
    let id = UUID()
}
Run Code Online (Sandbox Code Playgroud)

创建一个@Statevar 来保存nextView. 使用 。fullScreenCover(item:)显示nextView

@State private var nextView: IdentifiableView? = nil

var body: some View {
        
        VStack {
            // The CircularMenu
            CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
                .buttonStyle(PlainButtonStyle())

        }.fullScreenCover(item: self.$nextView, onDismiss: { nextView = nil}) { view in
            view.view
        }
}
Run Code Online (Sandbox Code Playgroud)

然后,self.nextView分配IdentifiableView

case .car: self.nextView = IdentifiableView(view: AnyView(Car()))
Run Code Online (Sandbox Code Playgroud)

当需要返回时使用MenuView关闭self.presentationMode.wrappedValue.dismiss()视图。这是最小视图的示例Car

struct Car: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var body: some View {
        Text("Car View").onTapGesture {
            self.presentationMode.wrappedValue.dismiss()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)