This does indeed appear to be a sad oversight from Apple...
However thankfully there are workarounds...
Code Block swift |
import Introspect |
|
extension UITextField { |
func addDoneButton() { |
self.keyboardAppearance = .light |
let keyboardToolbar = UIToolbar() |
keyboardToolbar.sizeToFit() |
|
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, |
target: nil, action: nil) |
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, |
target: self, action: #selector(resignFirstResponder)) |
keyboardToolbar.items = [flexibleSpace, doneButton] |
self.inputAccessoryView = keyboardToolbar |
} |
} |
|
extension View { |
func addDoneButton() -> some View { |
let helper = MainViewHelper() |
|
let customise: (UITextView) -> () = { uiTextView in |
let toolBar = UIToolbar(frame: CGRect(x: 0.0, |
y: 0.0, |
width: UIScreen.main.bounds.size.width, |
height: 44.0))//1 |
let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) |
let barButton = UIBarButtonItem(title: "Done", style: .plain, target: uiTextView, action: #selector(helper.close)) |
toolBar.setItems([flexible, barButton], animated: false)//4 |
uiTextView.inputAccessoryView = toolBar |
uiTextView.keyboardAppearance = .light |
} |
|
return introspect(selector: TargetViewSelector.siblingContaining, customize: customise) |
} |
} |
|
class MainViewHelper { |
@objc func close() { |
|
} |
} |
|
extension UITextView { |
func addDoneButton(title: String) { |
let textView = self |
let toolBar = UIToolbar(frame: CGRect(x: 0.0, |
y: 0.0, |
width: UIScreen.main.bounds.size.width, |
height: 44.0)) |
let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) |
let barButton = UIBarButtonItem(title: title, style: .plain, target: textView, action: #selector(close)) |
toolBar.setItems([flexible, barButton], animated: false)//4 |
self.inputAccessoryView = toolBar |
self.keyboardAppearance = .light |
} |
|
@objc func close() { |
self.resignFirstResponder() |
} |
} |
|