Почему не работает селектор моего сегментированного элемента управления на панели навигации? - PullRequest
1 голос
/ 05 мая 2020

Первая проблема:
Я могу переключаться между сегментами, но приложение не распознает переключение и никогда не запускает функцию выбора.

Вторая проблема:
Заголовок панели навигации не отображается.

screenshot

Вот код:

class ViewController: UIViewController {

    let mySegmentControl: UISegmentedControl = {
        let sc = UISegmentedControl(items: ["First","Second","Third"])
        sc.translatesAutoresizingMaskIntoConstraints = false
        sc.addTarget(self, action: #selector(handleSegmentChange), for: .valueChanged)
        sc.selectedSegmentIndex = 0

        if #available(iOS 13.0, *) {
            sc.selectedSegmentTintColor = .red
        } else {
            // Fallback on earlier versions
            sc.tintColor = .red
        }
        return sc
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        navigationController?.navigationBar.tintColor = .blue
        navigationController?.navigationBar.barTintColor = .yellow
        navigationItem.title = "My App"
        self.navigationItem.titleView = mySegmentControl
    }

    @objc func handleSegmentChange() {
        let chosedIndex = mySegmentControl.selectedSegmentIndex
        print(chosedIndex)
    }
}

1 Ответ

0 голосов
/ 05 мая 2020

Внутри замыкания, в котором вы создаете mySegmentConstrol, self не относится к тому, что, по вашему мнению, он делает. В этом случае self относится к чему-то типа (ViewController) -> () -> ViewController, что определенно не то, что вы хотите:

Some weird type

Для ссылки на текущий экземпляр ViewController, объявите mySegmentControl как lazy var:

lazy var mySegmentControl: UISegmentedControl = {

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

Что касается отображения * 1020 вашего элемента навигации *, ну ... вы не можете этого сделать, и показывают настраиваемый вид в titleView панели навигации. Одно или другое.

...