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

时间:2020-09-27 12:14:34

标签: swiftui segue swiftui-navigationlink

我每个人!我花了几个小时寻找一些我认为非常简单的东西,但是我却找不到最佳的方法... 我有自己的身体看法:

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()
        }
    }

我认为这很简单,但在案例行中却得到了Result of 'Car' initializer is unused。 那么有人知道如何实现这一目标吗?提前非常感谢!

2 个答案:

答案 0 :(得分:1)

如果要用新视图完全替换正文内容,则需要一些条件。假设您有一个os.system('python faceDetect.py')和一个Container,如果创建了一个body视图,我们将显示它:

Car

然后我们只需要在点击时分配汽车视图的新创建实例:

struct Container: View {

    @State var car: Car?      // Storage for optional Car view

    var body: some View {
        if let car = car {    // if the car view exists
            car               // returning the car view
        } else {              // otherwise returning the circular menu
            VStack {
                CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
                .buttonStyle(PlainButtonStyle())
            }
        }
    }
...

我看到您提到... func buttonClickHandler(_ index: Int) { switch index { .... //Car case 4: car = Car() // assigning the newly created instance ... } } } 和其他一些情况。因此,您的代码将比这稍微复杂一些,但是想法保持不变。我们存储一个视图或一些信息,这些信息可以帮助我们在必要时创建视图,然后根据条件返回选择器或视图。

答案 1 :(得分:1)

这里是一种方法:

创建一个名为struct的{​​{1}},其中包含一个IdentifiableView和一个AnyView

id

创建一个struct IdentifiableView: Identifiable { let view: AnyView let id = UUID() } 变量来保存@State。使用。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 } } 分配给self.nextView

IdentifiableView

是时候返回case .car: self.nextView = IdentifiableView(view: AnyView(Car())) 了,请使用MenuView关闭视图。这是一个最小的self.presentationMode.wrappedValue.dismiss()视图的示例:

Car