【问题标题】:How do I go to another view in swiftUI programmatically using Button (action:{}) {}, and NOT any NavigationLink or whatever?如何使用 Button (action:{}) {} 以编程方式转到 swiftUI 中的另一个视图,而不是任何 NavigationLink 或其他什么?
【发布时间】:2020-04-05 03:20:41
【问题描述】:

我正在尝试以编程方式更改我的 macOS 应用程序中的视图。一世 找到了 NavigationLink 和其他东西,但我不允许使用它们。切换的代码必须在Button的action中,因为这样我知道我可以从代码中快速切换,即使不是button格式。我该怎么做?

ContentView.swift 中的按钮:

Button(action: {
    //What goes here. Tried Settings(), didn't work          
}) {
    Text("Settings")
}.buttonStyle(PlainButtonStyle())

Settings.swift:

import SwiftUI

struct Settings: View {
    var body: some View {
        Text("Hello, world!")
    }
}

没有 NavigationLink、没有 NavigationView 或其他。我正在寻找一种纯粹在按钮操作中执行此操作的方法。

我对这个主题还有另一个问题,所以如果您知道 swiftui,请点击 here,回答这个问题对我来说至关重要。如果您回答了这个问题,也许您可​​以回答另一个问题,如果该问题得到可接受的答案,那么它就会被点亮。

【问题讨论】:

  • 您不必在出版物标题中添加 [EDITED] 或类似内容,因为在 SO 中,每次发布出版物时,它都会在队列中重新启动,以便监控标签被通知。这些类型的问题被认为是噪音。另一方面,SO 是一个帮助网站,因此无需在您的帖子中要求它,我们理解您需要帮助。
  • 另一方面,如果您有几个问题,那么您必须创建多个帖子,因为您将获得更多帮助。创建出版物的按钮是“”,而不是“s”。因此,对于您的第二个,我们邀请您创建一个新帖子。阅读How to AskHow to Answer 并通过tour(如果您还没有这样做)。
  • @eyllanesc 感谢您尝试改进我的问题,但这不是我的意思。我需要帮助的是找到一种可以在任何地方调用动画视图的方法,无论是在按钮操作中还是在调度队列中

标签: macos button swiftui


【解决方案1】:

这是一个例子:

在按钮的action 块中,您不能放置view。但是您可以切换bool,这是一个@State 变量,它会更新view,并在true 时显示不同的视图。我添加了一个带有.transition() 的动画,但是您需要将withAnimation 放在@State 变量的更改周围才能使其工作。

struct ContentView: View {
    @State var showView = false

    var body: some View {
        GeometryReader { proxy in
            ZStack {
                if self.showView {
                    VStack {
                        Text("Settings View")
                        Button(action: {
                            withAnimation {
                                self.showView.toggle()
                            }
                        }, label: {
                            Text("Back")
                        })
                    }
                    .frame(width: proxy.size.width, height: proxy.size.height)
                    .background(Color.red)
                    .transition(.move(edge: .trailing))
                } else {
                    VStack {
                        Text("Home View")
                        Button(action: {
                            withAnimation {
                                self.showView.toggle()
                            }
                        }, label: {
                            Text("Settings")
                        })
                    }
                    .frame(width: proxy.size.width, height: proxy.size.height)
                    .background(Color.green)
                }
            }
        }
    }
}

我希望这会有所帮助!

【讨论】:

  • 好的,谢谢,+1 的帮助,但这只是解决方案,但它的作用是在按钮旁边创建文本 hello world 并在我再次单击它时消失。如何让它进入一个完全不同的屏幕
  • @JulianTiemann 我将示例更改为全屏并在一个组件中。
【解决方案2】:

基本上这里需要3 views来实现这个功能, 主要ContentView 切换视图(HomeView 和 SettingView)。

这里HomeView 包含Setting button 并有一个@Binding 变量来处理按钮点击ContentView

因此,每当您单击 HomeView 上的 Setting 按钮时,它都会切换值 settingView ContentView 的变量,并根据它的值切换视图。

试试下面的代码。

内容视图:

struct ContentView: View {
    @State var settingView = false

    var body: some View {
        VStack {
            if self.settingView {
                Settings()
            } else {
              HomeView(buttonClick: $settingView)
            }
        }
    }
}

主页视图:

struct HomeView: View {
        @Binding var buttonClick: Bool

        var body: some View {
            VStack {
                Button(action: {
                    withAnimation {
                        self.buttonClick.toggle()
                    }
                }) {
                    Text("Settings")
                }.buttonStyle(PlainButtonStyle())
            }
        }
    }

【讨论】:

  • 你确定我需要这些吗?
  • 因为我已经在 iOS 中实现了这个功能。我需要所有这些。所以你也可以试试,如果能解决你的问题。
【解决方案3】:

如果您在第一个视图上单击开始,它会将您导航到下一个视图。您可以编辑第一个视图以满足您的视图要求

GloryHUbApp.swift

import SwiftUI

@main
struct GloryHubApp: App {
@State var currentStage = "OnboardingView"
var body: some Scene {
    WindowGroup {
            if(self.currentStage == "OnboardingView"){
                StartButtonView(currentStage: $currentStage)
            } else if(self.currentStage == "LoginView"){
                NextView()
            }
    }
  }
}

ButtonView.swift

import SwiftUI
struct StartButtonView: View {
// MARK: - PROPERTIES
@Binding var currentStage: String
// MARK: - BODY
var body: some View {
    Button(action: {
        //appStage = "LoginView"
        self.currentStage = "LoginView"
    }) {
        HStack (spacing: 8) {
            Text("START")
        }
    } //: BUTTO
  }
}

【讨论】:

    【解决方案4】:
    import SwiftUI
    
    struct StartButtonView: View {
    
        @State private var isActive = false
    
        var body: some View {
    
        Button(action: {
           isActive = true
        }, label: { 
           Text("START")
        })
    
        NavigationLink(destination: Settings(), isActive: $isActive) { }
    }
                
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多