Как уже говорилось в комментариях выше, ваш проект GitHub не содержит никаких данных.Тем не менее, все работает как положено (и мне кажется чище), если вы настраиваете пользовательский UIBarButtonItem
программно:
override func viewDidLoad() {
super.viewDidLoad()
setupBarButtonItem()
}
private func setupBarButtonItem() {
let offLabel = UILabel()
offLabel.font = UIFont.boldSystemFont(ofSize: UIFont.smallSystemFontSize)
offLabel.text = "OFF"
let onLabel = UILabel()
onLabel.font = UIFont.boldSystemFont(ofSize: UIFont.smallSystemFontSize)
onLabel.text = "ON"
let toggle = UISwitch()
toggle.addTarget(self, action: #selector(toggleValueChanged(_:)), for: .valueChanged)
let stackView = UIStackView(arrangedSubviews: [offLabel, toggle, onLabel])
stackView.spacing = 8
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: stackView)
}
@objc func toggleValueChanged(_ toggle: UISwitch) {
print("new value: \(toggle.isOn)")
}
![example](https://i.stack.imgur.com/vqeih.png)
Обновление:
Я заставил его работать и через раскадровку.В отличие от программной настройки вы должны встроить UIStackView
в обычный UIView
, чтобы иметь возможность добавить его как UIBarButtonItem
в раскадровку.Затем я добавил верхний, ведущий, нижний и конечный ограничения (каждое с константой 0 ) из UIStackView
в его суперпредставление.Чтобы избавиться от предупреждений и ошибок раскадровки во время разработки (во время выполнения это работает без каких-либо проблем), вы должны вручную вычислить и установить ширину для внешнего вида (который содержит UIStackView
), который необходим, чтобы заключить все этоподпредставления (offLabel.width
+ spacing
+ toggle.width
+ spacing
+ onLabel.width
).
![storyboard example](https://i.stack.imgur.com/rsvwi.png)