用于完成按钮的文本字段的 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:在带有完成按钮的文本框中弹出 DatePicker