Использование одних и тех же UILabels swift для разных значений функций

#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. Вы поняли, что я сделал? Нам просто нужно остановить обновления гироскопа перед отображением акселерометра и остановить обновления акселерометра перед отображением гироскопа