我在订阅 UITextField textDidChangeNotification 时无法使用最简单的组合模式实现。
import UIKit
import Combine
class ViewController: UIViewController {
let textField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(textField)
textField.frame = CGRect(x: 100, y: 0, width: view.frame.width, height: 100)
textField.placeholder = "Search"
let sub = NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification, object: textField)
.sink { (notification) in
print("123")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我一定遗漏了一些非常简单的东西,但是这个基本模式完全是从文档和其他教程中复制的。
谢谢您的帮助。
我的视图底部有一个文本输入字段,我正在尝试向上和向下设置动画以保持在键盘顶部。
func setupKeyboardObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillChangeFrame), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillChangeFrame), name: UIResponder.keyboardWillHideNotification, object: nil)
}
@objc func handleKeyboardWillChangeFrame(notification: NSNotification) {
let keyboardFrame = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let keyboardDuration = (notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double)
print(keyboardFrame)
orderDetailView?.textInputViewBottomAnchor?.constant = -keyboardFrame!.height
UIView.animate(withDuration: keyboardDuration!) {
self.view.layoutIfNeeded()
}
}
Run Code Online (Sandbox Code Playgroud)
OrderDetailView 是视图控制器的视图。
textinputview 是动画的部分,当键盘第一次出现时它可以正常工作,但是当我发送消息并且键盘退出第一响应者时不会动画回来,也不是我通过在键盘外单击来退出第一响应者。
当我从 keyboardFrameEndUserInfoKey 打印 cgrect 值时,它返回与键盘存在时相同的帧值(而不是 0)。
当我从视图中向下拖动键盘时,这似乎只能正常工作。
谢谢你的帮助。