簡體   English   中英

swift ui 擴展至完成按鈕的文本字段

[英]swift ui extension to textfield for done button

我有一個 iOS 應用程序,其中有幾個使用.keyboardType(.decimalPad) 的數字文本字段字段 - 但沒有辦法說“是的”我現在已經完成了編輯 - 所以我想要在鍵盤上完成或接受

當我搜索它時 - 我發現了大量示例,但它們主要與UITextfield相關,而不是文本字段 - 並設置了名為 InputAccessoryView 的內容 - 文本字段顯然不支持。 當我搜索過濾掉它們時 - 我發現各種奇怪的包裝器和一些事情,比如在父組件中添加工具欄,而不是文本字段本身 - 我在很多頁面上有很多文本字段,所以真的很想解決它在文本字段級別。

我想要的是構建文本字段的擴展- 這樣我就可以添加一個完成按鈕來關閉它 - 即這里的代碼,但實際編譯的東西 - 因為最后一行不起作用:

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 中的 swift ......除了使用第 3 方庫“自省”的建議之外 - 所有其他建議最終都會創建一個新的 class。

對於任何感興趣的人-我無論如何都找不到內省(有一天我會看看它在做什么並拉出關鍵部分)-但它確實給了我一個解決方案-所以有了這個擴展:

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 )
        }
    }
}

您所要做的就是將 add.addDoneButtonOnKeyboard() 添加到視圖中的文本字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM