如何动态地更改SegmentedControl中标签的值? Swift 4,iOS

时间:2019-03-07 12:14:15

标签: ios swift uisegmentedcontrol segmentedcontrol

我在执行分段控件时遇到一些问题。 我来找您(经验丰富的人),以获取一些有关如何解决此问题的建议。我去了:

对于“当前”标签,“面板的最佳方位角”和“面板的最佳倾斜角度”应为“跟踪太阳”(我将在稍后添加的代码),换句话说:这两个字段必须实时更新时间(再次,该代码我稍后会做)。 “ Panel的当前方位角”和“ Panels的当前倾斜角度”基本上根据手机的位置而变化(我使用coreMotion和coreLocation来获取它们)。

问题是这样的(解释后添加的图片):

对于“当前”选项卡,“面板的最佳方位角”和“面板的最佳倾斜角”字段必须随时间变化。必须从一开始就显示“面板的当前倾斜角度”  面板(电话)倾斜,并且不会倾斜(仅当您选择另一个选项卡时才倾斜)。

“面板的最佳倾斜角度”必须具有固定(但不同)的值 3、6个月和“年份”标签。 3、6个月和“年”选项卡的“面板最佳方位角”相同(该代码我也会在以后添加)。但是,当我选择“当前”选项卡时,我遇到了问题,在这里,“面板的最佳方位角”的值是“跟踪太阳”,并且 当我选择另一个选项卡时,该值将保留为“180º”。仅当手机仍在表面上时才会发生这种情况,一旦我移动手机,该字段中的值将更改为180º。当我从其他选项卡转到“当前”选项卡时,情况恰恰相反(而不是显示“跟踪太阳”,而是显示“180º”),该值再次在手机移动时出现,但是如果手机仍在,则“跟踪”太阳”)。

基本上,唯一有效的字段是分段控件中所有4个标签中的“面板当前方位角”。

请参考图片以获得更好的主意。

What I get in the initial view

What I want in the initial view

What I get if the phone is moving (this is correct for the 3, 6 months and year tabs)

What I get if the phone is still, if I chose the "current" tab while the phone was still and then I selected another tab

Same as previos image

所以,我的问题是:为了防止这种情况该怎么办?我试图在@IBAction中使用与分段控件相对应的switch-case语句,但是很明显,它不起作用。我在这 与您分享我用于项目的代码:

import UIKit
import CoreMotion
import CoreLocation

class PVOrientationViewController: UIViewController, CLLocationManagerDelegate {

//MARK: - Constants and Variables
let motionManager = CMMotionManager()
let locationManager = CLLocationManager()
var segIndex = 0

//MARK: - Outlets, views, actions
@IBOutlet weak var panelOptimalAz: UILabel!
@IBOutlet weak var panelOptimalTilt: UILabel!
@IBOutlet weak var panelCurrentAz: UILabel!
@IBOutlet weak var panelCurrentTilt: UILabel!

@IBOutlet weak var segmentedControl: UISegmentedControl!

//MARK: - Action of the Segmented Button.
@IBAction func indexChanged(_ sender: Any) {

    segIndex = segmentedControl.selectedSegmentIndex

    switch segIndex {

    case 0:
        print("Current Tab")
        panelOptimalAz.text = "Tracking the Sun"
        panelCurrentTilt.text = myDeviceMotion()
    case 1:
        print("3 months Tab")
        panelCurrentTilt.text = String(myDeviceMotion())

    case 2:
        print("6 months Tab")
        panelCurrentTilt.text = String(myDeviceMotion())

    case 3:
        print("Year tab")
        panelCurrentTilt.text = String(myDeviceMotion())

    default:
        panelOptimalAz.text = "No Optimal Azimuth given"
        panelCurrentAz.text = "No Current Azimuth given"
        panelCurrentTilt.text = "No Current Tilt given"
        panelOptimalTilt.text = "No Optimal Tilt given"

    }

}

//MARK: - viewDidLoad()
override func viewDidLoad() {
    super.viewDidLoad()

    locationManager.delegate = self

    // Azimuth
    if (CLLocationManager.headingAvailable()) {

        locationManager.headingFilter = 1
        locationManager.startUpdatingHeading()

    }

}

//MARK: - Motion methods
func myDeviceMotion() -> String{

    var currentTilt:String = "0.0º"
    if motionManager.isDeviceMotionAvailable {

        motionManager.deviceMotionUpdateInterval = 0.1

        motionManager.startDeviceMotionUpdates(to: OperationQueue()) {(motion, error) -> Void in

            if let attitude = motion?.attitude {

                DispatchQueue.main.async{

                    self.panelCurrentTilt.text = "\(String(format:"%.0f", attitude.pitch * 180 / Double.pi))º"

                    currentTilt = "\(String(format:"%.0f", attitude.pitch * 180 / Double.pi))º"

                }

            }

        }

        print("Device motion started")

    }else {

        print("Device motion unavailable")

    }

    return currentTilt

}

//MARK: - True heading and panel's heading
func locationManager(_ manager: CLLocationManager, didUpdateHeading heading: CLHeading) {

    let trueHeading = heading.trueHeading

    self.panelCurrentAz.text = "\(String(format: "%.0f", trueHeading))º"

    //If latitude >= 0, then panel's azimuth = 180º, else, it is 0º
    var panelHeading = 0.0
    if GlobalData.latit >= 0.0{

        self.panelOptimalAz.text = "180º"
        panelHeading = trueHeading - 180.0

        if panelHeading < 0{

            panelHeading += 360.0
            self.panelCurrentAz.text = "\(String(format: "%.0f", panelHeading))º"

        } else {

            panelHeading += 0.0
            self.panelCurrentAz.text = "\(String(format: "%.0f", panelHeading))º"

        }

    }else{

        self.panelOptimalAz.text = "0º"
        panelHeading = trueHeading + 180.0

        if panelHeading > 359.0{

            panelHeading -= 360.0
            self.panelCurrentAz.text = "\(String(format: "%.0f", panelHeading))º"

        } else {

            panelHeading += 0.0
            self.panelCurrentAz.text = "\(String(format: "%.0f", panelHeading))º"

        }

    }

}

}

提前感谢您的时间和建议。

问候。

1 个答案:

答案 0 :(得分:0)

重新安装...

OptimalAz标签上应显示“ Tracking the Sun” ,如果当前所选句段是“ Current”,则在{ {1}}仅在选择其他段时更新该标签。

if ()中启动运动管理器(以及位置管理器)...它将继续运行-并继续更新标签-因此不需要didUpdateHeading功能。

viewDidLoad()的末尾,触发myDeviceMotion()初始化标签(以及其他需要执行的任务/变量),就好像用户点击了“当前”段一样。

尝试一下(我认为我在代码中添加了足够的注释以解释任何更改):

viewDidLoad()