用于完成按钮的文本字段的 swift ui 扩展

Posted

技术标签:

【中文标题】用于完成按钮的文本字段的 swift ui 扩展【英文标题】:swift ui extension to textfield for done button 【发布时间】:2021-05-23 12:09:16 【问题描述】:

我有一个 ios 应用程序,其中包含多个使用 .keyboardType(.decimalPad) 的数字文本字段字段 - 但没有办法说“是的”我现在已经完成了编辑 - 所以我想要一些完成或接受键盘

当我搜索时 - 我发现 示例,但它们主要与 UITextfield 相关,而不是文本字段 - 并设置了名为 InputAccessoryView 的内容 - 文本字段显然不支持。当我搜索过滤掉它们时 - 我发现各种奇怪的包装器和一些事情,比如在父组件中添加工具栏,而不是文本字段本身 - 我在很多页面上有很多文本字段,所以真的很想解决它在文本字段级别。

我想要的是为文本字段构建一个 extension - 这样我就可以添加一个完成按钮来关闭它 - 即这里的代码,但实际编译的东西 - 因为最后一行没有工作:

extension TextField 
    func addDoneButtonOnKeyboard() 
        let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        doneToolbar.barStyle = .default

        let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: nil)

        let items = [flexSpace, done]
        doneToolbar.items = items
        doneToolbar.sizeToFit()

        self.inputAccessoryView = doneToolbar
    

所以我可以在我的 swiftui 代码中说:

     TextField("blah", $blah).addDoneButtonOnKeyboard()

另外 - 我有一些建议指向我其他问题,例如在 UIRepresentable 中包装 UITextField - 以快速访问 UIKit ......但我真的想找到一个解决方案,它是“TextField”的扩展",除了使用 3rd 方库的建议,"introspect" - 所有其他建议最终都会创建一个新类。

【问题讨论】:

这能回答你的问题吗? Is it possible to change "return" key to "done" on keyboard in 2020 with SwiftUI? 也许——它确实涉及添加一个外部库,“内省”——我仍然想知道如何自己做。 目前似乎没有办法直接使用 SwiftUI API 来实现。如果不想使用 Introspect,可以基于 UIKit 文本字段创建自己的 SwiftUI 文本字段视图,如本答案所示:***.com/a/60736029/4652564 【参考方案1】:

对于任何有兴趣的人 - 我无论如何都找不到 introspect(有一天我会看看它在做什么并提取关键部分) - 但它确实给了我一个解决方案 - 所以有了这个扩展:

public extension TextField

    func addDoneButtonOnKeyboard() -> some View
    
        let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        doneToolbar.barStyle = .default
        let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: nil, action: nil)
        doneToolbar.items = [flexSpace, done]
        doneToolbar.sizeToFit()
        return self.introspectTextField
        
            text_field in
            text_field.inputAccessoryView = doneToolbar
            done.target = text_field
            done.action = #selector( text_field.resignFirstResponder )
        
    

您所要做的就是将 .addDoneButtonOnKeyboard() 添加到视图中的文本字段。

【讨论】:

以上是关于用于完成按钮的文本字段的 swift ui 扩展的主要内容,如果未能解决你的问题,请参考以下文章

仅当所有文本字段都已填写时才在 Swift 中启用按钮

Swift:在带有完成按钮的文本框中弹出 DatePicker

访问 tableView SWIFT 中的文本字段

如何在 Swift 中创建自动完成文本字段

如何在 Swift 中更改键盘完成按钮上 Textfield 的文本?

Swift 中的异步 UI 测试