gpt4 book ai didi

ios - SwiftUI:如何在按钮单击+ API 调用后显示下一个 View

转载 作者:行者123 更新时间:2023-12-02 02:10:24 25 4
gpt4 key购买 nike

这听起来像是一项微不足道的任务,但我找不到解决此问题的正确解决方案。可能我还没有内化“SwiftUI-ish”的思维方式。

我有一个带有按钮的 View 。当 View 加载时,有一个条件(已经登录?),在该条件下 View 应该直接转到下一个 View 。如果单击该按钮,则会触发 API 调用(登录),如果成功,还会重定向到下一个 View 。

我的尝试是建立一个模型(ObservableObject)来保存变量“shouldRedirectToUploadView”,它是一个 PassThroughObject。一旦满足 View 中的 onAppear 条件或单击按钮(并且 API 调用成功),该变量就会翻转为 true 并告诉观察者更改 View 。

翻转模型中的“shouldRedirectToUploadView”似乎可行,但我无法使 View 重新评估该变量,因此新 View 将无法打开。

这是我迄今为止的实现:

模型

import SwiftUI
import Combine

class SboSelectorModel: ObservableObject {

var didChange = PassthroughSubject<Void, Never>()

var shouldRedirectToUpdateView = false {
didSet {
didChange.send()
}
}

func fetch(_ text: String) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.shouldRedirectToUpdateView = true
}
}
}

景色

import SwiftUI

struct SboSelectorView: View {
@State var text: String = ""
@ObservedObject var model: SboSelectorModel

var body: some View {
return ZStack {
if (model.shouldRedirectToUpdateView) {
UpdateView()
}
else {
Button(action: {
self.reactOnButtonClick()
}) {
Text("Start")
}
}
}.onAppear(perform: initialActions)
}

public func initialActions() {
self.model.shouldRedirectToUpdateView = true
}

private func reactOnButtonClick() {
self.model.fetch()
}
}

在旧的 UIKit 中,我会使用 ViewController 来捕获按钮单击的操作,然后将新 View 放在导航堆栈上。我该如何在 SwiftUI 中做到这一点?

在上面的示例中,我希望加载 View ,执行 onAppear() 函数,该函数执行 initialActions() 来翻转模型变量,这将使 View 对该更改使用react并呈现UploadView。为什么事情没有这样发生?

有这样的例子 Programatically navigate to new view in SwiftUIShow a new View from Button press Swift UIHow to present a view after a request with URLSession in SwiftUI?这表明相同的程序。然而它似乎对我不起作用。我错过了什么吗?

提前谢谢您!

最佳答案

Apple 引入了 @Published,它可以完成所有模型确实发生的更改 内容。

这对我有用,而且看起来干净多了。

当模型中的某些内容发生更改时,您还可以使用 .onReceive() 在 View 上执行操作。

class SboSelectorModel: ObservableObject {
@Published var shouldRedirectToUpdateView = false

func fetch(_ text: String) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.shouldRedirectToUpdateView = true
}
}
}

struct UpdateView: View {
var body: some View {
Text("Hallo")
}
}

struct SboSelectorView: View {
@State var text: String = ""
@ObservedObject var model = SboSelectorModel()

var body: some View {
ZStack {
if (self.model.shouldRedirectToUpdateView) {
UpdateView()
}
else {
Button(action: {
self.reactOnButtonClick()
}) {
Text("Start")
}
}
}.onAppear(perform: initialActions)
}

public func initialActions() {
self.model.shouldRedirectToUpdateView = true
}

private func reactOnButtonClick() {
self.model.fetch("")
}
}

我希望这会有所帮助。

编辑

所以这似乎在 beta 5 中发生了变化

这是一个带有 PassthroughSubject 的工作模型:

class SboSelectorModel: ObservableObject {
let objectWillChange = PassthroughSubject<Bool, Never>()


var shouldRedirectToUpdateView = false {
willSet {
objectWillChange.send(shouldRedirectToUpdateView)
}
}

func fetch(_ text: String) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.shouldRedirectToUpdateView = true
}
}
}

关于ios - SwiftUI:如何在按钮单击+ API 调用后显示下一个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58816265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com