web-dev-qa-db-ja.com

Swift 3でキーボード通知を書く方法

このコードをSwift 3:に更新しようとしています。

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)`

これまでのところ、コンパイラーによって与えられた自動修正を試しました。これにより、次のようなコードが生成されます。

let notificationCenter = NotificationCenter.default()
notificationCenter.addObserver(self, selector: Selector(("keyboardWillShow:")), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

notificationCenter.addObserver(self, selector: Selector(("keyboardWillHide:")), name: NSNotification.Name.UIKeyboardWillHide, object: nil)`

残念ながら、それは私を遠くに連れて行かず、追加のエラーをもたらします。

誰もこれを解決しましたか?

通知の書き方を試しているだけです。私は(まだ)通知機能を修正しようとはしていません。

17
David DelMonte

Swift 4

override func viewDidLoad() {
    super.viewDidLoad()   
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func keyboardWillShow(notification: NSNotification) {
     print("keyboardWillShow")
}

func keyboardWillHide(notification: NSNotification){
     print("keyboardWillHide")
}

これらのメソッド内の以下のコードを使用してキーボード情報を取得することもできます。

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil) .      

@objc func keyboardWillChange(notification: NSNotification) {
     let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
     let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
     let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
     let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
     let deltaY = targetFrame.Origin.y - curFrame.Origin.y
 }
24
ZAFAR007

Swift 4.2 Xcode 10(10L213o)

Swift 3と比較した主な変更点は、UIWindow.keyboardWillShowNotificationおよびUIWindow.keyboardWillHideNotification

let notifier = NotificationCenter.default
notifier.addObserver(self,
                     selector: #selector(KeyboardLayoutConstraint.keyboardWillShowNotification(_:)),
                     name: UIWindow.keyboardWillShowNotification,
                     object: nil)
notifier.addObserver(self,
                     selector: #selector(KeyboardLayoutConstraint.keyboardWillHideNotification(_:)),
                     name: UIWindow.keyboardWillHideNotification,
                     object: nil)


@objc
func keyboardWillShowNotification(_ notification: NSNotification) {}

@objc
func keyboardWillHideNotification(_ notification: NSNotification) {}
27
fssilva

このようなコードを書くことでこの問題を修正しました

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
24
Ben Rawner

Swift 4.2 .UIKeyboardWillShowUIResponder.keyboardWillShowNotificationに名前が変更され、.UIKeyboardWillHideUIResponder.keyboardWillHideNotificationに名前が変更されました]

 NotificationCenter.default.addObserver(self, selector: #selector(NameOfSelector), name: UIResponder.keyboardWillShowNotification , object: nil)
 NotificationCenter.default.addObserver(self, selector: #selector(NameOfSelector), name: UIResponder.keyboardWillHideNotification , object: nil)

   @objc func NameOfSelector() {
       //Actions when notification is received
    }
16

非推奨の文字列リテラルSelectorを型チェック済みの#selector(Class.method)ペアに置き換えることができます。

let center = NotificationCenter.default
center.addObserver(self,
                   selector: #selector(keyboardWillShow(_:)),
                   name: .UIKeyboardWillShow,
                   object: nil)

center.addObserver(self,
                   selector: #selector(keyboardWillHide(_:)),
                   name: .UIKeyboardWillHide,
                   object: nil)

Swift=は指定されたメソッドが実際に存在することをコンパイル時にチェックできるため、#selector構文ははるかに安全です。

Swiftセレクターの詳細については、 ricksterの詳細な回答 を参照してください。

13
user4151918

In Swift 3.

 override func viewDidLoad()
    {
        super.viewDidLoad()
 NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}

キーボードの表示と非表示

func keyboardWillShow(notification: NSNotification) 
{

      // Your Code Here
}

func keyboardWillHide(notification: NSNotification)
{  
   //Your Code Here     
}
3
Amul4608
  NotificationCenter.default.addObserver(self, selector: Selector(("keyboardWillShow:")), name:UIResponder.keyboardWillShowNotification, object: nil);
    NotificationCenter.default.addObserver(self, selector: Selector(("keyboardWillHide:")), name:UIResponder.keyboardWillHideNotification, object: nil);
1
SCS

それぞれSwift=の両方のバージョンでキーボード通知を実行できます。

Objserverを追加します。

NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: .UIKeyboardWillShow, object: nil)

関数を呼び出すSwift 3

func keyboardDidShow() {
          print("keyboardDidShow")
       }

関数呼び出しSwift 4

@objc func keyboardDidShow() {
      print("keyboardDidShow")
   }
1
Tech

https://stackoverflow.com/a/57430207/2885792 をご覧ください。 UITextFieldに関連していて、オブザーバーを正しく追加および削除した後でも解決できない場合。

0
Rohit saraf