Подтвердить что ты не робот

Добавьте UIToolBar ко всем клавиатурам (быстро)

Я пытаюсь добавить пользовательский 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
4b9b3361

Ответ 1

Благодаря предложению Glorfindel и примерному примеру 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)
}

Ответ 2

эквивалент вивианской версии в 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
    }
}

Ответ 3

У меня есть утилита, которую я использовал некоторое время (портировано на Swift из Objective-C), что делает это и немного больше, вам может показаться полезным:

https://github.com/ncerezo/SwiftKeyboardAccessory

Создает панель инструментов с по крайней мере кнопкой "Готово", чтобы закрыть клавиатуру и, при необходимости, кнопки "Далее" и "Предыдущий". Он также заботится о том, чтобы убрать клавиатуру, когда вы нажимаете вне текстового поля, а также изменяете размер и прокручиваете представление, когда клавиатура появляется или исчезает. Он предназначен для работы с UITableVIew, а также с UIScrollView.

Ответ 4

Вы можете выполнить работу подкласса 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