【问题标题】:Async Next Screen Presentation in SwiftUISwiftUI 中的异步下一个屏幕演示
【发布时间】:2019-10-29 03:22:54
【问题描述】:

我想在用户点击我的应用中的注册按钮时注册他们。注册完成并在服务器端成功创建用户后,我想显示下一个屏幕,然后

通常我有一个 PresentationButton 并设置目标,当有人单击该按钮时,会直接显示下一个屏幕,但现在它是异步的。

如何处理?

目前我有这个 PresentationButton:

PresentationButton(
                Text(isSignIn ? "SignIn" : "Next").font(.headline).bold()
                    .frame(width: 100)
                    .padding(10)
                    .foregroundColor(.white)
                    .background(Color.blue)
                    .cornerRadius(20)
                , destination: HomeScreen()
            )

这是 Uro Arangino 的建议:

struct PasswordView : View {
    @State private var password = ""
    @State private var showNextScreen = false

    var loginMode: LoginType

    @ObjectBinding var signupManager = SignUpManager()

    var body: some View {
        VStack {
//            if self.signupManager.showModal { self.showNextScreen.toggle() } <- Can't do this

            TwitterNavigationView(backBtnOn: false)
            middleView()
            Spacer()
            bottomView()
        }
    }

    func bottomView() -> some View {
        return VStack(alignment: .trailing) {
            Divider()
            BindedPresentationButton(
                showModal: $showNextScreen,
                label: getCustomText((Text("Registrieren"))),
                destination: HomeTabView(),
                onTrigger: {
                    let user = User(name: "rezo", username: "ja lol ey", profileDescription: "YAS", email: "dbjdb@dedde.de", telephoneNumber: nil, profileImage: UIImage(named: "twitter-logo")!, bannerImage: UIImage(systemName: "star")!)
                    self.signupManager.signIn(forUser: user, password: "ultraSecure", loginMode: .email)
//                UserDefaults.standard.set(true, forKey: "loggedIn")
            })
        }.padding([.leading, .trailing]).padding(.top, 5).padding(.bottom, 10)
    }
}

我的可绑定对象类

final class SignUpManager: BindableObject {
let didChange = PassthroughSubject<SignUpManager, Never>()

var showModal: Bool = false {
    didSet {
        didChange.send(self)
    }
}

func signIn(forUser user: User, password: String, loginMode: LoginType) {
    if loginMode == .email {
        LoginService.instance.signupWithEmail(user: user, andPassword: password, completion: handleCompletion)
    } else {
        LoginService.instance.login(withPhoneNumber: user.telephoneNumber!, completion: handleCompletion)
    }
}

private func handleCompletion(_ status: Bool) {
    if status {
        showModal = true
    }
}

}

【问题讨论】:

标签: ios swift swiftui


【解决方案1】:

您可以使用带有绑定的演示按钮。

见:https://stackoverflow.com/a/56547016/3716612

struct ContentView: View {
    @State var showModal = false

    var body: some View {
        BindedPresentationButton(
            showModal: $isSignIn,
            label: Text(isSignIn ? "SignIn" : "Next")
                .font(.headline)
                .bold()
                .frame(width: 100)
                .padding(10)
                .foregroundColor(.white)
                .background(Color.blue)
                .cornerRadius(20),
            destination: HomeScreen()
        )
    }
}

【讨论】:

  • 对于这样一个基本功能的苹果来说有点太复杂了......谢谢
  • 你为什么认为它很复杂。 Apple 为我们提供了另一种创建 UI 的方式。但是这种另一种方式需要(完全)不同的想法。所以思考不同。在学习了新的范例之后,我们可以享受声明式 UI 的简单性(并且希望也简单)。
  • 当 SwiftUI 中接收到 api 的数据时,我无法将 showModal 属性设置为 true。再次查看问题
  • 你能看看吗?
猜你喜欢
  • 2020-09-26
  • 2021-06-03
  • 2020-08-05
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多