Кнопка отмены UISearchController закрывает UITabBarController при многократном нажатии подряд - PullRequest
1 голос
/ 08 марта 2020

Я использую пользовательский контроллер поиска, у которого есть tableView для отображения результатов, проблема в том, что при многократном нажатии кнопки отмены он закрывает tabBarController.

Но если я нажимаю его обычно, он действует как должен быть.

class UICustomSearchController: UISearchController {
    private var suggestedTableView: UITableView!
    weak var suggestionDelegate: SearchSuggestionsDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        suggestedTableView = UITableView(frame: CGRect(x: 0, y: searchBar.frame.maxY,
                                                       width: view.frame.width,
                                                       height: view.frame.height - 70))

        suggestedTableView.backgroundColor = UIColor.clear
        suggestedTableView.tableFooterView = UIView()

        view.subviews.forEach {
            if $0.isKind(of: UITableView.self) {
                $0.removeFromSuperview()
            }
        }
        view.addSubview(suggestedTableView)

        suggestedTableView.dataSource = self
        suggestedTableView.delegate = self
        suggestedTableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")

        let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
        suggestedTableView.addGestureRecognizer(tap)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        suggestedTableView.removeFromSuperview()
        suggestedTableView = nil

        dismiss(animated: false, completion: nil)
    }

    func reloadSuggestions() {
        suggestedTableView.reloadData()
    }

    private func dismissView() {
        searchBar.text = ""
        suggestedTableView.removeFromSuperview()
        dismiss(animated: false, completion: nil)
        suggestionDelegate?.didDismissed()
    }

    // MARK: - Actions
    @objc func tableTapped(tap:UITapGestureRecognizer) {
        suggestedTableView.removeGestureRecognizer(tap)

        let location = tap.location(in: suggestedTableView)
        let path = suggestedTableView.indexPathForRow(at: location)
        if let indexPathForRow = path {
            tableView(suggestedTableView, didSelectRowAt: indexPathForRow)
        } else {
            dismissView()
        }
    }
}

extension UICustomSearchController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return suggestionDelegate?.suggestions().count ?? 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let list = suggestionDelegate?.suggestions() ?? []
        cell.textLabel?.text = list[indexPath.row]
        cell.textLabel?.textColor = UIColor.color(from: .blueTabBar)
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let list = suggestionDelegate?.suggestions() ?? []

        searchBar.text = list[indexPath.row]
        searchBar.becomeFirstResponder()
        suggestionDelegate?.didSelect(suggestion: list[indexPath.row])
    }
}

И в viewController, который имеет поиск:

func initSearchViews() {
        // Create the search controller and specify that it should present its results in this same view
        searchController = UICustomSearchController(searchResultsController: nil)
        searchController.hidesNavigationBarDuringPresentation = false

        searchController.searchBar.barTintColor = UIColor.white
        searchController.searchBar.tintColor = UIColor.color(from: .blueTabBar)
        searchController.searchBar.setValue(Strings.cancel.localized, forKey:"_cancelButtonText")
        searchController.suggestionDelegate = self

        if let searchTextField = searchController!.searchBar.value(forKey: "searchField") as? UITextField {
            searchTextField.placeholder = Strings.search.localized
        }

        // Make this class the delegate and present the search
        searchController.searchBar.delegate = self
    }

Я пытался поместить эту строку в viewController, но ничего не произошло:

definesPresentationContext = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...