【问题标题】:NotificationCenter default addObserver works only when charging?NotificationCenter 默认 addObserver 只在充电时起作用?
【发布时间】: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 中,通知发生了变化。 stackoverflow.com/a/52325564/7734643

标签: ios swift3


【解决方案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 的主视图中使用另一个容器视图并调整容器视图的位置。如果您有自动布局,请通过更改约束值而不是更改视图的框架来移动视图。
  • 嗯,充电器部分很奇怪,但这并没有给你任何东西。看看最后一条评论中的建议,看看它是否有任何不同。如果您正确获取键盘值,则主视图的框架更改可能是问题。
猜你喜欢
  • 1970-01-01
  • 2018-02-16
  • 2023-04-05
  • 2018-12-21
  • 2011-10-13
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2010-11-19
相关资源
最近更新 更多