在 Popover 中选择 SwiftUI 单元格

Posted

技术标签:

【中文标题】在 Popover 中选择 SwiftUI 单元格【英文标题】:Select SwiftUI cell in Popover 【发布时间】:2019-07-01 09:06:35 【问题描述】:

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

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

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

为了能够将AddUserView 用作UIHostingController 中的rootView,我必须使用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 中的错误?

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

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

(运行playground时,必须再次点击start playground才能正常运行,第一次Save popover不起作用)。

【问题讨论】:

【参考方案1】:

你试过了吗

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

【讨论】:

是的,这实际上解决了禁用 TextField 的问题。

以上是关于在 Popover 中选择 SwiftUI 单元格的主要内容,如果未能解决你的问题,请参考以下文章

用于在滚动视图中跟踪对象的 Popover 箭头

从popover返回后如何在collectionview单元格中填充文本字段

每个部分具有不同单元格的 SwiftUI 列表

如何在 SwiftUI 中删除列表选择指示器和分隔符?

如何在 Popover 的 TableView 选择中禁用动画?

UIPopOverController + UITableView - 选择单元格时隐藏弹出框