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.y0,那么什么也不会发生。对吧?

@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

Swift 学习之 NotificationCenter

声明 NotificationCenter.default.addObserver [swift]

没有这样的模块错误“NotificationCenter”WatchOS,Swift

NotificationCenter swift3无法观察帖子

为 watchOS Simulator 构建时 NotificationCenter 不可用