Using same swift UIlabels for different function values

58 views Asked by At

I am programming an iOS app using swift where i have 3 UILabels which will show data different sensors data into the same corresponding labels.

These are 3 labels which i am using.

@IBOutlet weak var xAccel: UILabel!
@IBOutlet weak var yAccel: UILabel!
@IBOutlet weak var zAccel: UILabel!

I am using UIsegmentedControl to change the display of data which is as follows.

@IBAction func AccelDidChange(_ sender: UISegmentedControl) {
        
       switch sender.selectedSegmentIndex {
        case 0:
            myAccelerometer()
            break
        case 1:
           myGyroscope()
           break
        default:
            myAccelerometer()
        }

Above used 2 functions are as follows

 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)"
                }
            }
        }

** Problem is it keeps on displaying both the Accelerometer and Gyroscope data on UILabels at the same time instead of only showing the data of a particular sensor when tapped. I have tried to use the break option but still not working. If any one could point out the possible solution, that would be great. Thanks **

EIDT - Here is the output on screen where you can see the values fluctuates between different sensors. I only want readings from 1 sensor at a time. https://i.stack.imgur.com/8QvLb.jpg

1

There are 1 answers

1
Alexander Nikolaychuk On BEST ANSWER
@IBAction func AccelDidChange(_ sender: UISegmentedControl) {
     
    switch sender.selectedSegmentIndex {
     case 0:
         motion.stopGyroUpdates()
         myAccelerometer()
         break
     case 1:
        motion.stopDeviceMotionUpdates()
        myGyroscope()
        break
     default:
         myAccelerometer()
     }
    
}

You need to stop unneeded resource before the switch. Try this please