尝试处理导航栏标题视图内的分段控制开关

Trying to handle segmented control switch inside of navigation bar title view

我使用

创建了一个分段控件
private let updateSwitch: UISegmentedControl = {
    let sc = UISegmentedControl(items: ["Sign In", "Sign Out"])
    sc.anchor(width: 128, height: 32)
    sc.selectedSegmentIndex = 0
    sc.tintColor = .mainBlue
    sc.backgroundColor = .mainGray
    sc.addTarget(self, action: #selector(handleSegmentedControlSwitch(_:)), for: .valueChanged)
    return sc
}()

然后我使用

将 updateSwitch 添加到我的导航栏
navigationItem.titleView = updateSwitch

分段控件显示完全正常,但每当我 select 登录或注销时,select 或代码不会执行

@objc func handleSegmentedControlSwitch(_ segmentedControl: UISegmentedControl) {
    switch(segmentedControl.selectedSegmentIndex) {
        case 0:
            print("Sign In")
        break
        case 1:
            print("Sign Out")
        break
        default:
        break
    }
}

知道如何解决这个问题吗?

附件是工作分段控件的图像

这是因为你的 UISegmentControl 声明。

你有两种方法:

1。将其声明为 lazy var:

因为惰性变量中的 Self 是有效的。

    private lazy var updateSwitch: UISegmentedControl = {
     let sc = UISegmentedControl(items: ["Sign In", "Sign Out"])
     sc.anchor(width: 128, height: 32)
     sc.selectedSegmentIndex = 0
     sc.tintColor = .mainBlue
     sc.backgroundColor = .mainGray
     sc.addTarget(self, action: #selector(handleSegmentedControlSwitch(_:)), for: .valueChanged)
    return sc }()

2。在 viewDidLoad

中分配动作
    override func viewDidLoad() {
    super.viewDidLoad()
    let segmented = self.updateSwitch
    segmented.addTarget(self, action: #selector(handleSegmentedControlSwitch(_:)), for: .valueChanged)
    navigationItem.titleView = segmented
}