Задержка в UISearchBar удаляется при нажатии следующего контроллера представления - PullRequest
0 голосов
/ 19 февраля 2019

Xcode 10.1, Swift 4.2

ViewController A имеет LargeTitles , UISearchController и UITableView в действии.

При нажатии ViewController B (также TableView) после выбора TableViewCell происходит задержка в пространстве, которое было занято удалением UISearchBar, как показано в анимации.

ViewController B также имеетUISearchController, но, как обычно, скрыт до тех пор, пока пользователь не потянет вниз по экрану.

Кто-нибудь знает, как предотвратить это?

enter image description here

Дополнительная информация и код:

ViewController A При касании ячейки он толкает ViewController B с помощью Show (например, Push) перехода на раскадровкус Анимацией выбрано.Данные вводятся с использованием метода prepareForSegue .

performSegue(withIdentifier: "showLogbook", sender: self)

ViewController B:

class LogbookVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchResultsUpdating {

    //Extract
    private let searchController = UISearchController(searchResultsController: nil)


    @IBOutlet private var addButton: UIBarButtonItem!
    @IBOutlet private var shareButton: UIBarButtonItem!
    @IBOutlet private var backButton: UIBarButtonItem!
    @IBOutlet private var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        tableView.rowHeight = 75.0
        //loading tableView data
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.definesPresentationContext = true
    configureSearchController()
    fetchAndSortLogEntries()
}

private func configureSearchController() {
    navigationItem.searchController = searchController
    searchController.searchResultsUpdater = self
    searchController.searchBar.scopeButtonTitles = ["Newest", "Oldest"]
    searchController.searchBar.delegate = self
    searchController.searchBar.barStyle = .black
    searchController.searchBar.tintColor = K.Colors.appMid
    searchController.searchBar.keyboardAppearance = .dark
    searchController.searchBar.returnKeyType = .done
    searchController.dimsBackgroundDuringPresentation = false
    let attributes = [NSAttributedString.Key.foregroundColor: K.Colors.appMid]
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes, for: .normal)
    searchController.searchBar.setValue("Reset", forKey: "_cancelButtonText")
    let searchBarCancelButton = searchController.searchBar.value(forKey: "cancelButton") as? UIButton
    searchBarCancelButton?.setTitle("Reset", for: .normal)
}

1 Ответ

0 голосов
/ 20 февраля 2019

Я думаю, что это ошибка при использовании LargeTitles и наличии двух UISearchControllers в смежных ViewControllers.

Я обнаружил, что, добавив UISearchController к NavigationItem в viewDidAppearустраняет проблему, однако ее необходимо добавлять асинхронно, в противном случае возникает следующая фатальная ошибка:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Only one palette with a top boundary edge can be active outside of a transition.

Этот код необходимо добавить к обоим ViewControllers, чтобы при переходе назад было предотвращено поведение проблемыв ViewController A.

Xcode 10.1, Swift 4.2

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        DispatchQueue.main.async {
            self.navigationItem.searchController = self.searchController
            self.searchController.searchResultsUpdater = self
            self.searchController.searchBar.delegate = self
        }
    }

Этот код гарантирует, что NavigationBar не будет скрыт при появлении следующего ViewController:

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.isNavigationBarHidden = false
    }

enter image description here

...