Попытка обработки сегментированного переключателя внутри представления заголовка панели навигации - PullRequest
0 голосов
/ 13 апреля 2020

Я создал сегментированный элемент управления с помощью

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

Сегментированный элемент управления отображается полностью нормально, но всякий раз, когда я выбираю любой из них, войдите в систему. или выйти, код селектора не выполняется

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

Есть идеи, как это исправить?

Прикрепленное изображение рабочего сегментированного элемента управления

image of working segmented control

1 Ответ

1 голос
/ 13 апреля 2020

Это из-за вашей декларации UISegmentControl.

У вас есть 2 способа:

1. объявите его как lazy var :

, потому что Self в lazy var допустимо.

    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
}
...