質問編集履歴

2 背景の追加

hirotoshin

hirotoshin score 16

2016/10/14 17:11  投稿

swift 計算エラー
質問失礼します。
テキストビューをキーボードの上にずらすというプログラムを書いたのですが、let txtLimit = txtActiveView.frame.origin.y + txtActiveView.frame.height + 8.0の場所でEXC_BAD_INSTRUCTION (code=EXC_i386_INVOP, subcode=0x0)というエラーが出てしまいます。
計算のミスだということはわかるのですが、どうしたらよいかよくわかりません。
テキストフィールドのときはうまく行ったのですが、テキストビューにした途端このエラーが吐かれました。  
教えていただけたら幸いです。
よろしくお願いします。
```swift
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
   @IBOutlet weak var scroll: UIScrollView!
   @IBOutlet weak var text1: UITextField!
   @IBOutlet weak var text2: UITextField!
   @IBOutlet weak var text3: UITextView!
   @IBOutlet weak var text4: UITextView!
   
   var txtActiveView: UITextView!//編集後のtextFieldを新しく格納する変数を定義
   
   
   override func viewDidLoad() {
       super.viewDidLoad()
       
       // Do any additional setup after loading the view, typically from a nib.
       text3.delegate = self
       text4.delegate = self//デリゲート設定(このdelegateは画面もしくはreturnをタップした時にキーボードを閉じる処理を扱うのに必要なもので、NSNotificationCenterを使うために必要としているものではない。)
       // Do any additional setup after loading the view, typically from a nib.
   }
   // Viewが画面に表示される度に呼ばれるメソッド
   override func viewWillAppear(animated: Bool) {
   // NSNotificationCenterへの登録処理
       let notificationCenter = NSNotificationCenter.defaultCenter()
       notificationCenter.addObserver(self, selector: "handleKeyboardWillShowNotification:", name: UIKeyboardWillShowNotification, object: nil)
       notificationCenter.addObserver(self, selector: "handleKeyboardWillHideNotification:", name: UIKeyboardWillHideNotification, object: nil)
   }
   // Viewが非表示になるたびに呼び出されるメソッド
   override func viewDidDisappear(animated: Bool) {
       super.viewDidDisappear(animated)
       
   // NSNotificationCenterの解除処理
       let notificationCenter = NSNotificationCenter.defaultCenter()
       notificationCenter.removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
       notificationCenter.removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
   }
   //画面がタップされた際にキーボードを閉じる処理
   func tapGesture(sender: UITapGestureRecognizer) {
       text3.resignFirstResponder()
       text4.resignFirstResponder()
       
   }
   //キーボードのreturnが押された際にキーボードを閉じる処理
   func textFieldShouldReturn(textView: UITextView) -> Bool {
       text3.resignFirstResponder()
       text4.resignFirstResponder()
       //       itemMemo.resignFirstResponder()
       return true
   }
   //textFieldを編集する際に行われる処理
   func textFieldShouldBeginEditing(textView: UITextView) -> Bool {
       txtActiveView = textView // 編集しているtextFieldを新しいtextField型の変数に代入する
       return true
   }
   
   //キーボードが表示された時
   func handleKeyboardWillShowNotification(notification: NSNotification) {
       //郵便入れみたいなもの
       let userInfo = notification.userInfo!
       //キーボードの大きさを取得
       let keyboardRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
   // 画面のサイズを取得
       let myBoundSize: CGSize = UIScreen.mainScreen().bounds.size
   // ViewControllerを基準にtextFieldの下辺までの距離を取得
       let txtLimit = txtActiveView.frame.origin.y + txtActiveView.frame.height + 8.0
   // ViewControllerの高さからキーボードの高さを引いた差分を取得
       let kbdLimit = myBoundSize.height - keyboardRect.size.height
       
   // こうすることで高さを確認できる(なくてもいい)
       print("テキストフィールドの下辺:(\(txtLimit))")
       print("キーボードの上辺:(\(kbdLimit))")
       
       //スクロールビューの移動距離設定
       if txtLimit >= kbdLimit {
           scroll.contentOffset.y = txtLimit - kbdLimit
       }
   }
   
   //ずらした分を戻す処理
   func handleKeyboardWillHideNotification(notification: NSNotification) {
       scroll.contentOffset.y = 0
   }
}
```
  • Swift

    9131 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1341 questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

1 エラー内容の追加

hirotoshin

hirotoshin score 16

2016/10/14 16:55  投稿

swift 計算エラー
質問失礼します。
テキストビューをキーボードの上にずらすというプログラムを書いたのですが、let txtLimit = txtActiveView.frame.origin.y + txtActiveView.frame.height + 8.0の場所でエラーが出てしまいます。
テキストビューをキーボードの上にずらすというプログラムを書いたのですが、let txtLimit = txtActiveView.frame.origin.y + txtActiveView.frame.height + 8.0の場所でEXC_BAD_INSTRUCTION (code=EXC_i386_INVOP, subcode=0x0)というエラーが出てしまいます。
計算のミスだということはわかるのですが、どうしたらよいかよくわかりません。
教えていただけたら幸いです。
よろしくお願いします。
```swift
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
   @IBOutlet weak var scroll: UIScrollView!
   @IBOutlet weak var text1: UITextField!
   @IBOutlet weak var text2: UITextField!
   @IBOutlet weak var text3: UITextView!
   @IBOutlet weak var text4: UITextView!
   
   var txtActiveView: UITextView!//編集後のtextFieldを新しく格納する変数を定義
   
   
   override func viewDidLoad() {
       super.viewDidLoad()
       
       // Do any additional setup after loading the view, typically from a nib.
       text3.delegate = self
       text4.delegate = self//デリゲート設定(このdelegateは画面もしくはreturnをタップした時にキーボードを閉じる処理を扱うのに必要なもので、NSNotificationCenterを使うために必要としているものではない。)
       // Do any additional setup after loading the view, typically from a nib.
   }
   // Viewが画面に表示される度に呼ばれるメソッド
   override func viewWillAppear(animated: Bool) {
   // NSNotificationCenterへの登録処理
       let notificationCenter = NSNotificationCenter.defaultCenter()
       notificationCenter.addObserver(self, selector: "handleKeyboardWillShowNotification:", name: UIKeyboardWillShowNotification, object: nil)
       notificationCenter.addObserver(self, selector: "handleKeyboardWillHideNotification:", name: UIKeyboardWillHideNotification, object: nil)
   }
   // Viewが非表示になるたびに呼び出されるメソッド
   override func viewDidDisappear(animated: Bool) {
       super.viewDidDisappear(animated)
       
   // NSNotificationCenterの解除処理
       let notificationCenter = NSNotificationCenter.defaultCenter()
       notificationCenter.removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
       notificationCenter.removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
   }
   //画面がタップされた際にキーボードを閉じる処理
   func tapGesture(sender: UITapGestureRecognizer) {
       text3.resignFirstResponder()
       text4.resignFirstResponder()
       
   }
   //キーボードのreturnが押された際にキーボードを閉じる処理
   func textFieldShouldReturn(textView: UITextView) -> Bool {
       text3.resignFirstResponder()
       text4.resignFirstResponder()
       //       itemMemo.resignFirstResponder()
       return true
   }
   //textFieldを編集する際に行われる処理
   func textFieldShouldBeginEditing(textView: UITextView) -> Bool {
       txtActiveView = textView // 編集しているtextFieldを新しいtextField型の変数に代入する
       return true
   }
   
   //キーボードが表示された時
   func handleKeyboardWillShowNotification(notification: NSNotification) {
       //郵便入れみたいなもの
       let userInfo = notification.userInfo!
       //キーボードの大きさを取得
       let keyboardRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
   // 画面のサイズを取得
       let myBoundSize: CGSize = UIScreen.mainScreen().bounds.size
   // ViewControllerを基準にtextFieldの下辺までの距離を取得
       let txtLimit = txtActiveView.frame.origin.y + txtActiveView.frame.height + 8.0
   // ViewControllerの高さからキーボードの高さを引いた差分を取得
       let kbdLimit = myBoundSize.height - keyboardRect.size.height
       
   // こうすることで高さを確認できる(なくてもいい)
       print("テキストフィールドの下辺:(\(txtLimit))")
       print("キーボードの上辺:(\(kbdLimit))")
       
       //スクロールビューの移動距離設定
       if txtLimit >= kbdLimit {
           scroll.contentOffset.y = txtLimit - kbdLimit
       }
   }
   
   //ずらした分を戻す処理
   func handleKeyboardWillHideNotification(notification: NSNotification) {
       scroll.contentOffset.y = 0
   }
}
```
  • Swift

    9131 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1341 questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る