更改视图而不使用导航链接SwiftUI

更改视图而不使用导航链接SwiftUI,swiftui,segue,swiftui-navigationlink,Swiftui,Segue,Swiftui Navigationlink,我爱所有人!我花了几个小时寻找一些我认为很简单的东西,但我无法找到最好的方法。。。 我有我的身体观: var body: some View { VStack { // The CircularMenu CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonC

我爱所有人!我花了几个小时寻找一些我认为很简单的东西,但我无法找到最好的方法。。。 我有我的身体观:

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

        }
    }
它包含一个循环菜单。每次单击菜单项都会调用:

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")
        }
    }
我想执行一个简单的视图转换到另一个名为Car的视图。nextView函数如下所示:

func nextView(destination: DestinationViewType) {
        
        switch destination {
            case .car: Car()
        }
    }
我认为这很简单,但我得到了:在案例行中未使用“Car”初始值设定项的结果。
所以有人知道如何做到这一点?提前多谢

如果要用新视图完全替换主体内容,则需要一些条件。假设您有一个带有主体的容器,如果创建了汽车视图,我们将显示它:

结构容器:视图{ @State var car:car?//可选car视图的存储 var body:一些观点{ 如果let car=car{//如果存在car视图 car//返回car视图 }else{//否则返回循环菜单 VStack{ CircularNumenuItems:homeMenuItems,menuRadius:55,menuButtonSize:55,menuButtonColor:.黑色,buttonClickCompletion:buttonClickHandler\ .ButtonStyle纯ButtonStyle } } } ... 然后我们只需要在单击时指定新创建的汽车视图实例:

... func buttonClickHandler_uu索引:Int{ 开关指数{ .... //汽车 案例4: car=car//分配新创建的实例 ... } } }
我知道你提到了destinationViewTyp和其他一些案例。因此,您的代码将比这稍微复杂一些,但想法保持不变。我们存储一个视图或一些信息来帮助我们在必要时创建视图,然后根据条件返回选择器或视图。

如果您想用新视图完全替换正文内容,您需要一些条件。假设您有一个带有主体的容器,如果创建了汽车视图,我们将显示它:

结构容器:视图{ @State var car:car?//可选car视图的存储 var body:一些观点{ 如果let car=car{//如果存在car视图 car//返回car视图 }else{//否则返回循环菜单 VStack{ CircularNumenuItems:homeMenuItems,menuRadius:55,menuButtonSize:55,menuButtonColor:.黑色,buttonClickCompletion:buttonClickHandler\ .ButtonStyle纯ButtonStyle } } } ... 然后我们只需要在单击时指定新创建的汽车视图实例:

... func buttonClickHandler_uu索引:Int{ 开关指数{ .... //汽车 案例4: car=car//分配新创建的实例 ... } } }
我知道你提到了destinationViewTyp和其他一些案例。因此,您的代码将比这稍微复杂一些,但想法保持不变。我们存储一个视图或一些信息,在必要时帮助我们创建一个视图,然后根据条件返回一个选择器或视图。

这里有一种方法:

创建名为IdentifiableView的结构,该结构包含AnyView和id:

创建@State变量以保存下一个视图。使用.fullScreenCoveritem:显示下一个视图

然后,将self.nextView指定为可识别视图:

返回菜单视图时,请使用self.presentationMode.wrappedValue.disclose关闭视图。以下是最小汽车视图的示例:


这里有一种方法:

创建名为IdentifiableView的结构,该结构包含AnyView和id:

创建@State变量以保存下一个视图。使用.fullScreenCoveritem:显示下一个视图

然后,将self.nextView指定为可识别视图:

返回菜单视图时,请使用self.presentationMode.wrappedValue.disclose关闭视图。以下是最小汽车视图的示例:


这是否回答了您的问题?谢谢,但此方法使用navigationlink。我不想使用它。在哪一行代码中找到了NavigationLink@Silvering是否提供我的答案以寻求帮助?这是否回答了您的问题?谢谢,但此方法使用navigationlink。我不想使用它。在哪一行代码中找到了NavigationLink@Silvering帮了我的忙吗?非常感谢Denis。你的解决方案非常有效!谢谢你,丹尼斯。你的解决方案非常有效!非常感谢@vacawama。你的解决方案非常有效!!我认为你的解决方案是最好的。非常感谢各位,我非常欣赏vacawama的银行。你的解决方案非常有效!!我认为你的解决方案是最好的。非常感谢各位,我很感激
struct IdentifiableView: Identifiable {
    let view: AnyView
    let id = UUID()
}
@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
        }
}
case .car: self.nextView = IdentifiableView(view: AnyView(Car()))
struct Car: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var body: some View {
        Text("Car View").onTapGesture {
            self.presentationMode.wrappedValue.dismiss()
        }
    }
}