Есть ли способ сказать iOS обновить внешний вид клавиатуры в контроллере представления? - PullRequest
3 голосов
/ 03 мая 2019

Я бы хотел обновить UIKeyboardAppearance в ViewController. Под этим я имею в виду, скажем, VC загружается с UIKeyboardAppearance.default. Если я нажму кнопку, я бы хотел, чтобы клавиатура обновилась до .dark, и теперь клавиатура отображается в том же VC, что и .dark.

Насколько я могу судить, iOS проверяет значение UIKeyboardAppearance при загрузке VC и не проверяет снова, пока не загрузит VC снова. Даже если вы измените значение UIKeyboardAppearance и скроете / покажите клавиатуру.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

// creating a simple text box, and making the placeholder text the value of the keyboardAppearance
        myTextBox.backgroundColor = UIColor.lightGray
        myTextBox.frame = CGRect(x: 30, y: 200, width: 300, height: 50)
        view.addSubview(myTextBox)
        UITextField.appearance().keyboardAppearance = .dark
        myTextBox.becomeFirstResponder()
        myTextBox.placeholder = "Keybaoard Appearance is: \(UITextField.appearance().keyboardAppearance.rawValue)"

// a simple button to toggle the keyboardAppearance
        toggleButton.frame = CGRect(x: 30, y: 300, width: 300, height: 50)
        toggleButton.setTitle("Toggle Keyboard", for: .normal)
        toggleButton.backgroundColor = UIColor.red
        toggleButton.addTarget(self, action: #selector(toggleButtonFunction), for: .touchUpInside)
        view.addSubview(toggleButton)

    }

// toggles the keyboardAppearance. Hides the keyboard, and a second later shows it again.
    @objc func toggleButtonFunction() {
        if UITextField.appearance().keyboardAppearance == .dark {
            UITextField.appearance().keyboardAppearance = .default
        }
        else {
            UITextField.appearance().keyboardAppearance = .dark
        }
        myTextBox.resignFirstResponder()
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
            self.myTextBox.becomeFirstResponder()
            self.myTextBox.placeholder = "Keybaoard Appearance is: \(UITextField.appearance().keyboardAppearance.rawValue)"

            })
    }

    let myTextBox = UITextField()
    let toggleButton = UIButton()
}

Я надеялся, что после изменения UIKeyboardAppearance и скрытия / показа клавиатуры он будет отображаться с новым внешним видом (.dark или .default), но он будет постоянно отображаться с тем же внешним видом, пока VC не будет загружен снова , Вы можете увидеть значение UIKeyboardAppearance изменений, но iOS, похоже, не проверяет это обновление, пока VC не загрузится снова.

Есть ли способ вызвать перепроверку в ВК?

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Вы можете рекурсивно изменять внешний вид клавиатуры всех текстовых полей на вашем экране (расширение allSubviewsOf(type:) от , это отличный ответ Мохаммада Садика ):

func changeTextFieldKeyboardAppearance() {
    UITextField.appearance().keyboardAppearance = .dark

    let textFields = view.allSubviewsOf(type: UITextField.self)

    let firstResponder = textFields.first { $0.isFirstResponder }

    firstResponder?.resignFirstResponder()

    textFields.forEach { $0.keyboardAppearance = .dark }

    firstResponder?.becomeFirstResponder()
}

[...]

extension UIView {
    func allSubviewsOf<T: UIView>(type: T.Type) -> [T] {
        var all = [T]()

        func getSubview(view: UIView) {
            if let aView = view as? T {
                all.append(aView)
            }

            guard !view.subviews.isEmpty else {
                return
            }

            view.subviews.forEach{ getSubview(view: $0) }
        }

        getSubview(view: self)

        return all
    }
}

Если вашконтроллер представления встроен в UITabBarController, вы можете запустить обновление, изменив его selectedIndex и сразу же вернув его к исходному индексу:

guard let tabBarController = tabBarController else {
    return
}

let selectedIndex = tabBarController.selectedIndex

UITextField.appearance().keyboardAppearance = .dark

tabBarController.selectedIndex = selectedIndex == 1 ? 0 : 1
tabBarController.selectedIndex = selectedIndex
0 голосов
/ 04 мая 2019

Спасибо Тамашу за ответ!

Это привело меня на путь, чтобы найти то, что мне было нужно.

Похоже, что если вы измените внешний вид клавиатуры для UITextField

UITextField.appearance().keyboardAppearance = .dark

, система проверяет только загрузку VC.Если вы измените его для каждого textField

myTextBox.keyboardAppearance = .dark

, система будет проверять каждый раз при изменении firstResponder и загружать правильную клавиатуру.

Еще раз спасибо Tamás!

...