Search code examples
iosswiftuistoryboardmobile-application

Using same swift UIlabels for different function values


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.sstatic.net/8QvLb.jpg


Solution

  • @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