gpt4 book ai didi

ios - 有没有办法告诉 iOS 在 View Controller 中更新键盘外观?

转载 作者:搜寻专家 更新时间:2023-10-31 22:53:12 24 4
gpt4 key购买 nike

我想更新 ViewController 中的 UIKeyboardAppearance。我的意思是让我们假设 VC 使用 UIKeyboardAppearance.default 加载。如果我按下一个按钮,我希望键盘更新为 .dark 并让键盘现在显示在与 .dark 相同的 VC 中。

据我所知,iOS 在加载 VC 时检查 UIKeyboardAppearance 的值,并且在再次加载 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 再次加载之前不会检查该更新。

有没有办法强制在 VC 中进行重新检查?

感谢您的帮助!

最佳答案

您可以递归地更改屏幕上所有文本字段的键盘外观(allSubviewsOf(type:) 扩展名来自 this great answer by Mohammad Sadiq ):

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

如果您的 View Controller 嵌入在 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

关于ios - 有没有办法告诉 iOS 在 View Controller 中更新键盘外观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55968321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com