Добавить UIToolBar на все клавиатуры (swift)
Я пытаюсь добавить пользовательский UIToolBar для всех моих клавиатур с небольшим повторением. То, как я это делаю, требует, чтобы я добавил код ко всем моим viewDidLoads и назначил делегат каждого текстового поля viewController, который я использую. Я попытался создать свой собственный подкласс UIToolBar, но обнаружил, что я не могу этого сделать, когда цель для моих кнопок "готово" и "отмена" - это представление себя. У кого-нибудь есть предложения по созданию легко повторно используемой панели инструментов? Спасибо продвижение.
override func viewDidLoad() {
super.viewDidLoad()
var toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.Default
toolBar.translucent = true
toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1)
var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: "donePressed")
var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelPressed")
var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.userInteractionEnabled = true
toolBar.sizeToFit()
stateField.inputAccessoryView = toolBar
stateField.delegate = self
5 ответов
благодаря предложению Глорфиндела и образцу кода ncerezo я решил свою проблему с помощью расширений.
extension UIViewController: UITextFieldDelegate{
func addToolBar(textField: UITextField){
var toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.Default
toolBar.translucent = true
toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1)
var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: "donePressed")
var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelPressed")
var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.userInteractionEnabled = true
toolBar.sizeToFit()
textField.delegate = self
textField.inputAccessoryView = toolBar
}
func donePressed(){
view.endEditing(true)
}
func cancelPressed(){
view.endEditing(true) // or do something
}
}
хотя мне все еще нужно вызвать код ниже на всех моих текстовых полях. Я чувствую, что может быть лучший способ без вызова функции на каждом текстовом поле, но пока это определенно более многоразово.
override func viewDidLoad() {
super.viewDidLoad()
addToolBar(addressField)
}
эквивалент версии vivian в swift 3:
extension UIViewController: UITextFieldDelegate {
func addToolBar(textField: UITextField) {
let toolBar = UIToolbar()
toolBar.barStyle = .default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor(red: 76 / 255, green: 217 / 255, blue: 100 / 255, alpha: 1)
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(donePressed))
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
textField.delegate = self
textField.inputAccessoryView = toolBar
}
func donePressed() {
view.endEditing(true)
}
func cancelPressed() {
view.endEditing(true) // or do something
}
}
У меня есть утилита, которую я использую некоторое время (портирован на Swift из Objective-C) , которая делает это и немного больше, вы можете найти ее полезной:
https://github.com/ncerezo/SwiftKeyboardAccessory
Он создает панель инструментов, по крайней мере, с кнопкой" Готово", чтобы отклонить клавиатуру, а также, возможно, следующие и предыдущие кнопки. Он также заботится об отклонении клавиатуры при нажатии за пределами текстового поля, а также об изменении размера и прокрутке представления, когда клавиатура появляется или исчезает. Он предназначен для работы с UITableVIew, а также с UIScrollView.
вы можете сделать подкласс UIToolbar работать, воспользовавшись цепочкой ответчика. Нет необходимости менять контроллеры вида. В Swift 3:
class KeyboardAccessoryToolbar: UIToolbar {
convenience init() {
self.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
self.barStyle = .default
self.isTranslucent = true
self.tintColor = UIColor(red: 76 / 255, green: 217 / 255, blue: 100 / 255, alpha: 1)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.done))
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancel))
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
self.items = [cancelButton, spaceButton, doneButton]
self.isUserInteractionEnabled = true
self.sizeToFit()
}
func done() {
// Tell the current first responder (the current text input) to resign.
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
func cancel() {
// Call "cancel" method on first object in the responder chain that implements it.
UIApplication.shared.sendAction(#selector(cancel), to: nil, from: nil, for: nil)
}
}
затем добавьте следующий код applicationDidFinishLaunching
чтобы применить это ко всем клавиатурам:
let accessoryView = KeyboardAccessoryToolbar()
UITextField.appearance().inputAccessoryView = accessoryView
UITextView.appearance().inputAccessoryView = accessoryView
для swift 4 Вы можете использовать это: -
extension Login_VC : UITextFieldDelegate {
func addToolBar(textField: UITextField){
var toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1)
var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: "donePressed")
var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: "cancelPressed")
var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
textField.delegate = self
textField.inputAccessoryView = toolBar
}
func donePressed(){
view.endEditing(true)
}
func cancelPressed(){
view.endEditing(true) // or do something
}
}