2017-03-29 5 views
0

現在私のアプリをSwift 3に変換していますが、この機能に問題があります。条件付きの結合のためのKeyboardWillShow通知でSwift 2から3に変換中にオプションのエラーが発生しました

初期化子はオプションのタイプを持っている必要があり、「CGFloat」

エラーが3行目に表示されません。

私が最後にプログラムして以来、しばらくしているので、これを解決する方法がわかりません。

func keyboardWillShow(_ sender: Notification) { 
     if let userInfo = sender.userInfo { 
      if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.size.height { 
       let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as AnyObject).doubleValue 
       let edgeInsets = UIEdgeInsetsMake(0, 0, keyboardHeight, 0) 
       UIView.animate(withDuration: duration!, animations: {() -> Void in 
        self.tableView.contentInset = edgeInsets 
        self.tableView.scrollIndicatorInsets = edgeInsets 
        self.view.layoutIfNeeded() 
       }) 
      } 
     } 
    } 

答えて

0

if let foo = userInfo[UIKeyboardFrameEndUserInfoKey] { 
    let keyboardHeight = (foo as as AnyObject).cgRectValue.size.height 

に変更

if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.size.height { 

を---更新---

または

if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject?).cgRectValue.size.height { 

AnyObject?AnyObjectにはOptionalが含まれている可能性があります。したがって、あなたは明示的にOptionalにキャストする必要があります。 AnyObject?またはOptional<AnyObject>のいずれかが動作します。

3

これは、私が強制アンラッピングをお勧めするまれな状況の1つです。あなたはを知っていますuserInfoにはこの情報が含まれています。さらに、AnyObjectを経由するか、cgRectValueを呼び出す必要はありません。あなたは1回の移動でCGRectに完全にキャストできます。だから私は書くでしょう:

let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! CGRect).size.height 

(我々は条件付きの結合をしていないので、何もifが存在しないことに注意してください。私たちは単にキャスト、KABOOM。)

を[必要は今まで存在しないことをあまりにも注意してくださいdurationを取得するか、animateまたはlayoutIfNeededを呼び出してください。あなたはそのすべてを捨てることができます。私たちは、アニメーションですでにあり、そしてcontentInsetscrollIndicatorInsetsへの変更は、キーボードに時間にアニメ化されます。]

関連する問題