質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

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

Q&A

解決済

1回答

2743閲覧

数値を表示させたいのにUILabelの表示がLabelのまま

yuuki_yui_

総合スコア14

Swift

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

0グッド

0クリップ

投稿2018/04/26 05:02

編集2018/04/26 13:09

加速度センサの値をLabelに表示させたいです。

数値を表示させたいのにUILabelの表示がシミレーションにおいて、Labelのままで、表示されません。エラーメッセージはないです。何が悪いのかわかりません。

該当のソースコード

swift

1import UIKit 2import CoreMotion 3 4class ViewController: UIViewController { 5 6 var myMotionManager: CMMotionManager! 7 8 // ストーリーボードを使ってプロパティを作成 9 @IBOutlet weak var xValue: UILabel! 10 @IBOutlet weak var yValue: UILabel! 11 @IBOutlet weak var zValue: UILabel! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 myMotionManager = CMMotionManager() 17 18 // 加速度計の更新周期を設定 19 myMotionManager.accelerometerUpdateInterval = 1.0 20 21 // 加速度の値を取得、表示 22 let accelerometerHandler = {(data:CMAccelerometerData?, 23 error: NSError?) -> Void in 24 25 self.xValue.text = "x=(data!.acceleration.x)" 26 self.yValue.text = "y=(data!.acceleration.y)" 27 self.zValue.text = "z=(data!.acceleration.z)" 28 } 29 30 31 func didReceiveMemoryWarning() { 32 super.didReceiveMemoryWarning() 33 // Dispose of any resources that can be recreated. 34 } 35} 36}

下記のように、コードを変更しました。```swift

import UIKit import CoreMotion class ViewController: UIViewController { var myMotionManager: CMMotionManager! @IBOutlet weak var xValue: UILabel! @IBOutlet weak var yValue: UILabel! @IBOutlet weak var zValue: UILabel! override func viewDidLoad() { super.viewDidLoad() myMotionManager = CMMotionManager() // 加速度計の更新周期を設定 myMotionManager.accelerometerUpdateInterval = 1.0 // 加速度 let accelerometerHandler = {(data:CMAccelerometerData?, error: NSError?) -> Void in self.xValue.text = "x=(data!.acceleration.x)" self.yValue.text = "y=(data!.acceleration.y)" self.zValue.text = "z=(data!.acceleration.z)" } //追記したコード myMotionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler : accelerometerHandler as ! CMAccelerometerData) } }

変更しました

import UIKit import CoreMotion class ViewController: UIViewController { var myMotionManager: CMMotionManager! @IBOutlet weak var xValue: UILabel! @IBOutlet weak var yValue: UILabel! @IBOutlet weak var zValue: UILabel! override func viewDidLoad() { super.viewDidLoad() myMotionManager = CMMotionManager() // 加速度計の更新周期を設定 myMotionManager.accelerometerUpdateInterval = 1.0 // 加速度 NSErrorをErrorに変更 let accelerometerHandler = {(data:CMAccelerometerData?, error: Error?) -> Void in self.xValue.text = "x=(data!.acceleration.x)" self.yValue.text = "y=(data!.acceleration.y)" self.zValue.text = "z=(data!.acceleration.z)" } //必要ない場所を削除 myMotionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler : accelerometerHandler ) } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/04/26 05:08

コードは ``` で囲って下さい。
guest

回答1

0

ベストアンサー

startAccelerometerUpdates(to:withHandler:)を呼ばないと動作しません。

投稿2018/04/26 05:12

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuki_yui_

2018/04/26 12:32

重ね重ね申し訳ありません。 ``` myMotionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler : accelerometerHandler as! CMAccelerometerHandler) ``` というコードを追加してみたのですが、 Thread1 : EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0 と出てしまいます。エラーログにも何も出ず、調べて見てもわかりません。このエラーはどうすれば解決できるのでしょうか。
fuzzball

2018/04/26 12:40

ハンドラ定義のところのNSErrorをErrorに変えてみて下さい。 あと、 as! CMAccelerometerHandler は必要ないはずなので削除して下さい。(エラーが出たので付けたのでしょうか?) NSErrorからErrorに変更してもエラーが出るようであれば、エラー内容を書いて下さい。 また、追記したコードは質問内に書いて下さい。(追記したことが分かるように)
yuuki_yui_

2018/04/26 13:02

不備が多々あり、申し訳ありません。以降、気をつけます。 Errorに変更し、as! CMAccelerometerHandlerを削除しました。エラーも出ず、シミュレータが起動したのですが、UILabelはLabelという表示のままです。
fuzzball

2018/04/26 13:50

ハンドラの中(ラベル設定してるとこ)に、 print(Thread.isMainThread) を追加して、Consoleに何か出力されるかどうか、 出力されるなら何が出力されるか教えて下さい。
fuzzball

2018/04/27 00:40 編集

上記の件、こちらで確認しましたが問題無さそうでした。おそらく現状のコードで正しく動作しています。 ただし、私が見落としていたのですが、「シミレーションにおいて」というのはシミュレータで動かしているということですよね。残念ながらシミュレータはジャイロセンサーに対応していません。(isAccelerometerAvailable = falseです)
yuuki_yui_

2018/04/27 04:16

シミュレータがジャイロセンサに対応していないことをわかっていませんでした。コード、動作の確認をしていただいて本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問