UIButton не вызывает действие, когда UISearchBar в навигационной панели является firstResponder - PullRequest
0 голосов
/ 12 июня 2018

Я хочу иметь UIButton в UIViewController, когда пользователь редактирует текст в UISearchBar, который является частью UINavigationBar.UIButton реагирует на прикосновения (показывает выделенное состояние), но не вызывает своего действия.Та же проблема для других UIControl классов, таких как UISwitch.

Чтобы сделать его более интригующим: при размещении UISearchBar в UIViewController в UIView проблем нет.

Что я должен сделать, чтобы вызвать действие кнопки, когда UISearchBar активен?

Пример VC:

import UIKit

class ViewController: UIViewController {
    private let button: UIButton = {
        let button = UIButton(type: UIButtonType.system)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setTitle("Test", for: .normal)
        button.setTitleColor(.green, for: .normal)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        return button
    }()

    private let textField: UITextField = {
        let textField = UITextField()
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.placeholder = "place"
        textField.borderStyle = .bezel
        textField.addTarget(self, action: #selector(textFieldTriggered), for: .allEditingEvents)
        return textField
    }()

    private let uiSwitch: UISwitch = {
        let uiSwitch = UISwitch()
        uiSwitch.translatesAutoresizingMaskIntoConstraints = false
        uiSwitch.addTarget(self, action: #selector(switchToggled), for: UIControlEvents.valueChanged)
        return uiSwitch
    }()

    private let formSearchBar: UISearchBar = {
        let searchBar = UISearchBar()
        searchBar.translatesAutoresizingMaskIntoConstraints = false
        return searchBar
    }()

    private let navigationSearchBar: UISearchBar = {
        return UISearchBar()
    }()

    init() {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        view.addSubview(button)
        view.addSubview(textField)
        view.addSubview(formSearchBar)
        view.addSubview(uiSwitch)

        NSLayoutConstraint.activate([
            view.safeAreaLayoutGuide.leadingAnchor.constraint(equalTo: button.leadingAnchor, constant: -16),
            view.safeAreaLayoutGuide.topAnchor.constraint(equalTo: button.topAnchor, constant: -16),
            button.bottomAnchor.constraint(equalTo: textField.topAnchor, constant: -16),
            view.safeAreaLayoutGuide.leadingAnchor.constraint(equalTo: textField.leadingAnchor, constant: -16),
            textField.widthAnchor.constraint(equalToConstant: 100),
            textField.bottomAnchor.constraint(equalTo: formSearchBar.topAnchor, constant: -16),
            view.safeAreaLayoutGuide.leadingAnchor.constraint(equalTo: formSearchBar.leadingAnchor, constant: -16),
            formSearchBar.widthAnchor.constraint(equalToConstant: 100),
            formSearchBar.bottomAnchor.constraint(equalTo: uiSwitch.topAnchor, constant: -16),
            view.safeAreaLayoutGuide.leadingAnchor.constraint(equalTo: uiSwitch.leadingAnchor, constant: -16),
        ])

        navigationItem.titleView = navigationSearchBar
        _ = navigationSearchBar.becomeFirstResponder()
    }

    @objc
    private func buttonTapped() {
        let color = button.titleColor(for: .normal)
        button.setTitleColor(color == .green ? .red : .green, for: .normal)
    }

    @objc
    private func textFieldTriggered() {
        textField.placeholder = textField.placeholder == "place" ? "holder" : "place"
    }

    @objc
    private func switchToggled() {
        UIView.animate(withDuration: 0.3) {
            self.uiSwitch.isOn = !self.uiSwitch.isOn
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...