2015-01-05 87 views
0

我正在使用「編程iOS 8」中的以下代碼。我有一個包含簡單文本字段的約束子視圖。這種觀點對於超級觀點的限制來說是最重要的,也是最重要的。我也有一個子視圖的插座。這裏的目標是當鍵盤出現時,它將推動這個子視圖。我在「let f = self.fr!.frame」一行中得到一個錯誤:線程1:EXC_BAD_INSTRUCTION。它是否需要解開可選項?這可能是我的限制問題嗎?任何幫助將非常感激。謝謝。當鍵盤出現約束時Swift-Move查看

import UIKit 

class ViewController: UIViewController { 

@IBOutlet var topSpace: NSLayoutConstraint! 
@IBOutlet var bottomSpace: NSLayoutConstraint! 
@IBOutlet var slidingView: UIView! 
var fr: UIView? 

override func viewDidLoad() { 
    NSNotificationCenter.defaultCenter().addObserver(
     self, selector: "keyboardShow:", 
     name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(
     self, selector: "keyboardHide:", 
     name: UIKeyboardWillHideNotification, object: nil) 




    super.viewDidLoad() 

} 


func textFieldDidBeginEditing(tf: UITextField) { 
    self.fr = tf // keep track of the first responder 
} 

func textFieldShouldReturn(tf: UITextField) -> Bool { 

    tf.resignFirstResponder() 
    self.fr = nil 
    return true 

} 

func keyboardShow(n:NSNotification) { 
    let d = n.userInfo! 
    var r = (d[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue() 
    r = self.slidingView.convertRect(r, fromView:nil) 
    let f = self.fr!.frame 
    let y : CGFloat = 
    f.maxY + r.size.height - self.slidingView.bounds.height + 5 
    if r.origin.y < f.maxY { 
     self.topSpace.constant = -y 
     self.bottomSpace.constant = y 
     self.view.layoutIfNeeded() 
    } 
} 

func keyboardHide(n:NSNotification){ 
    self.topSpace.constant = 0 
    self.bottomSpace.constant = 0 
    self.view.layoutIfNeeded() 
} 



override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

回答

0

如果我沒有弄錯,鍵盤顯示在開始編輯之前,所以當你的鍵盤顯示時,你的self.fr仍然是零。檢查它是否爲零。它不應該做任何事情與可選的展開。它只有當你解開一個null時纔會失敗。

+0

我仍然試圖理解上面的代碼,我在書中找到了這些代碼。我很抱歉,如果這是一個簡單的修復。當我觸摸文本框時會出現此錯誤。鍵盤不顯示,這是控制檯中的錯誤:致命錯誤:意外地發現零,同時展開一個可選值 –

+0

我設置了tf作爲我的文本字段的出口。 –