首页 > 解决方案 > 在 Popover 中选择 SwiftUI 单元格

问题描述

我正在尝试SwiftUI使用UIHostingController带有可以点击的列表的弹出框。首先要填写用户名和密码,然后在列表中点击用户角色,点击保存按钮时弹出框关闭。

此外,在验证用户信息之前,应禁用导航栏中的保存按钮。

Xcode 游乐场可以从我的 GitHub 存储库https://github.com/imyrvold/Popover获取

为了能够在 中AddUserView用作 rootView UIHostingController,我必须使用 Xcode 故事板,并将其添加到 Xcode Playground 中的资源中。

import SwiftUI
import Combine

public struct AddUserView : View {
    @ObjectBinding public var loginInfo: LoginInfo
    @EnvironmentObject var viewModel: RoleViewModel
    @State var selectedRole: Role? = nil
    @Environment(\.isPresented) var isPresented: Binding<Bool>?

    public var body: some View {
        NavigationView {
            VStack {
                TextField(self.$loginInfo.firstName, placeholder: Text("First Name"))
                TextField(self.$loginInfo.lastName, placeholder: Text("Last Name"))
                TextField(self.$loginInfo.email, placeholder: Text("Email"))
                SecureField(self.$loginInfo.password, placeholder: Text("Password"))

                Divider()

                List(self.viewModel.roles) { role in
                    RoleCell(role: role).tapAction {
                        self.selectedRole = role
                    }
                }
            }
                .padding()
                .navigationBarTitle(Text("Add User"))
                .navigationBarItems(trailing:
                    Button(action: {
                        self.saveAction()
                        self.isPresented?.value = false
                    }) {
                        Text("Save")
                })//.disabled(!self.loginInfo.isValid)
        }
    }

    // MARK:- Action methods
    func saveAction() {

    }

}

我遇到的第一个问题是,当我取消注释时disabled(!self.loginInfo.isValid),所有 TextField 也被禁用。不确定这是否是 SwiftUI 中的错误?

我也想让role单元格在点击时在单元格上设置复选标记,但到目前为止我一直无法弄清楚如何做到这一点。

当点击保存按钮时,如何关闭弹出框?

弹出框 Xcode 游乐场

(运行 Playground 时,必须再次单击 start Playground 才能正常运行,第一次 Save 弹出框不起作用)。

标签: popoverswiftuixcplayground

解决方案


你试过这个

.navigationBarItems(trailing:
                Button(action: {
                    self.saveAction()
                    self.isPresented?.value = false
                }) {
                    Text("Save")
            }.disabled(!self.loginInfo.isValid))

推荐阅读