#ios #swift #uistoryboard #mobile-application
#iOS #swift #uistoryboard #мобильное приложение
Вопрос:
Я программирую приложение iOS с использованием swift, где у меня есть 3 UILabels, которые будут отображать данные разных датчиков в одних и тех же соответствующих метках.
Это 3 метки, которые я использую.
@IBOutlet weak var xAccel: UILabel!
@IBOutlet weak var yAccel: UILabel!
@IBOutlet weak var zAccel: UILabel!
Я использую UISegmentedControl для изменения отображения данных следующим образом.
@IBAction func AccelDidChange(_ sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
myAccelerometer()
break
case 1:
myGyroscope()
break
default:
myAccelerometer()
}
Выше использованные 2 функции заключаются в следующем
func myAccelerometer() {
// sets the time of each update
motion.accelerometerUpdateInterval = 0.1
//accessing the data from the accelerometer
motion.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
// can print the data on the console for testing purpose
//print(data as Any)
if let trueData = data {
self.view.reloadInputViews()
//setting different coordiantes to respective variables
let x = trueData.acceleration.x
let y = trueData.acceleration.y
let z = trueData.acceleration.z
//setting the variable values to label on UI
self.SensorName.text = "Accelerometer Data"
self.xAccel.text = "x : (x)"
self.yAccel.text = "y : (y)"
self.zAccel.text = "z : (z)"
}
}
}
func myGyroscope() {
motion.gyroUpdateInterval = 0.1
motion.startGyroUpdates(to: OperationQueue.current!) { (data, error) in
if let trueData = data {
self.view.reloadInputViews()
//setting different coordiantes to respective variables
let x = trueData.rotationRate.x
let y = trueData.rotationRate.y
let z = trueData.rotationRate.z
//setting the variable values to label on UI
self.SensorName.text = "Gyroscope Data"
self.xAccel.text = "x: (x)"
self.yAccel.text = "y: (y)"
self.zAccel.text = "z: (z)"
}
}
}
**
Проблема в том, что он продолжает отображать данные акселерометра и гироскопа на UILabels одновременно, вместо того, чтобы показывать только данные определенного датчика при нажатии. Я пытался использовать опцию break, но все еще не работает. Если бы кто-нибудь мог указать на возможное решение, это было бы здорово. Спасибо
**
EIDT — Вот вывод на экран, где вы можете видеть, как значения колеблются между разными датчиками. Мне нужны показания только с 1 датчика одновременно. https://imgur.com/a/21xW4au
Комментарии:
1. итак, xAccel должен выглядеть как — x: 33, x: 22? Или как?
2. Итак, вам не нужен элемент управления сегментом, и вы просто показываете данные акселерометра и данные гироскопа на одной метке?. Не ясно, какой результат вам нужен.
3. xAccel должен выводить значение координаты x акселерометра только при нажатии на акселерометр в сегментированном управлении, и тот же xAccel должен выводить значение координаты x гироскопа только при нажатии на гироскоп в сегментированном управлении.
4. Проблема здесь в startAccelerometerUpdates. Вам нужно получить данные один раз нажатием и остановить обновления, я прав?
5. Я отредактировал исходное сообщение и добавил gif для лучшего понимания. Я хочу, чтобы значения менялись с акселерометра на гироскоп ТОЛЬКО при нажатии метки. Не всегда так, как это видно на gif. Спасибо
Ответ №1:
@IBAction func AccelDidChange(_ sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
motion.stopGyroUpdates()
myAccelerometer()
break
case 1:
motion.stopDeviceMotionUpdates()
myGyroscope()
break
default:
myAccelerometer()
}
}
Вам необходимо остановить ненужный ресурс перед переключением. Попробуйте это, пожалуйста
Комментарии:
1. Вы поняли, что я сделал? Нам просто нужно остановить обновления гироскопа перед отображением акселерометра и остановить обновления акселерометра перед отображением гироскопа