NotificationCenter 默认 addObserver 只在充电时起作用?
Posted
技术标签:
【中文标题】NotificationCenter 默认 addObserver 只在充电时起作用?【英文标题】:NotificationCenter default addObserver works only when charging? 【发布时间】:2018-09-18 07:18:33 【问题描述】:我试图在使用键盘显示时将我的文本字段向上移动,而当键盘隐藏时它又会向下移动。所以我在那里使用NotificationCenter.default.addObserver
,但这只有在充电时才能正常工作,当我从充电器中取出时它不起作用,即它不会移动可能出现的情况。请帮我解决这个问题。提前致谢
下面是我的代码:
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
@objc func keyboardWillShow(notification: NSNotification)
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
if self.view.frame.origin.y != 0
self.view.frame.origin.y -= 50
@objc func keyboardWillHide(notification: NSNotification)
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
if self.view.frame.origin.y != 0
self.view.frame.origin.y += 50
【问题讨论】:
“当我从充电器中取出时它不工作” - 会发生什么?不动?移动错误的金额?崩溃?还有什么? 它不动@AshleyMills @Ashishyadav 你的键盘显示了吗? 是的键盘显示@RakeshaShastri 这是迄今为止我在 SO 上看到的最奇怪的问题。 :'D 另外你应该使用UIKeyboardFrameEndUserInfoKey
而不是UIKeyboardFrameBeginUserInfoKey
。在 Swift 4.2 中,通知发生了变化。 ***.com/a/52325564/7734643
【参考方案1】:
如果self.view.frame.origin.y
是0
,那么什么也不会发生。对吧?
@objc func keyboardWillShow(notification: NSNotification)
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
// If `origin.y` is `0`, then do nothing.
if self.view.frame.origin.y != 0
self.view.frame.origin.y -= 50
@objc func keyboardWillHide(notification: NSNotification)
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
// If `origin.y` is `0` in `keyboardWillShow`,
// it will still be `0` here.
// So, do nothing.
if self.view.frame.origin.y != 0
self.view.frame.origin.y += 50
【讨论】:
代码有问题。当origin.y
为零时,什么都不会发生。我想你需要检查if-else
流程。
感谢@AechoLiu 成功了。我已经删除了那个条件,它工作正常【参考方案2】:
问题是您使用的是UIKeyboardFrameBeginUserInfoKey
而不是UIKeyboardFrameEndUserInfoKey
。
代码应该是:
@objc func keyboardWillShow(_ notification: Notification)
if let keyboardFrame: NSValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
【讨论】:
你检查你得到的键盘高度值了吗? 是的,我正在获取键盘值,当我连接充电器时它正在工作 另一个建议是改变您上下移动的视图。在 ViewController 的主视图中使用另一个容器视图并调整容器视图的位置。如果您有自动布局,请通过更改约束值而不是更改视图的框架来移动视图。 嗯,充电器部分很奇怪,但这并没有给你任何东西。看看最后一条评论中的建议,看看它是否有任何不同。如果您正确获取键盘值,则主视图的框架更改可能是问题。以上是关于NotificationCenter 默认 addObserver 只在充电时起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 `NotificationCenter+Rx` 在 RxCocoa 而不是 RxSwift
声明 NotificationCenter.default.addObserver [swift]
没有这样的模块错误“NotificationCenter”WatchOS,Swift