После updateSearchResults при переходе пропадает navigation bar

searchbar
tableview

#1

в StoryBoard
NavigationController -> TableViewController -> ViewController
Пре переходе с TableView по cell все хорошо, navigation bar на месте, левая кнопка работает и можно спокойно вернуться, но как только осуществляю поиск, и перехожу по cell, переход осуществляется, но navigation bar пропадает!!!
Что я сделал не так!!! Прошу ПОМОЩИ!!!


#2

Слишком мало информации. Из вашего описания не понятно как поиск реализован. Скрины, код.


#3

Проект Master-Detail APP
Вот код, storyboard и appDelegate не трогал

    //  MasterViewController.swift
import UIKit

class MasterViewController: UITableViewController {

    var detailViewController: DetailViewController? = nil
    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()
        
        setNavigationBar()
        
        if let split = splitViewController {
            let controllers = split.viewControllers
            detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
        }
    }
    
    func setNavigationBar() {
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
        navigationItem.searchController?.searchBar.placeholder = "Enter text:"
        navigationItem.searchController?.searchResultsUpdater = self
        navigationItem.searchController?.obscuresBackgroundDuringPresentation = false
        navigationItem.searchController?.definesPresentationContext = true
        
    }
    

    override func viewWillAppear(_ animated: Bool) {
        clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed
        super.viewWillAppear(animated)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Segues

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail" {
            if let indexPath = tableView.indexPathForSelectedRow {
                let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
                controller.detailItem = isFiltering() ? DataSource.shared.filterData[indexPath.row] : DataSource.shared.data[indexPath.row]
                controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
                controller.navigationItem.leftItemsSupplementBackButton = true
            }
        }
    }

    // MARK: - Table View

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return isFiltering() ? DataSource.shared.filterData.count : DataSource.shared.data.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let object = isFiltering() ? DataSource.shared.filterData[indexPath.row] : DataSource.shared.data[indexPath.row]
        cell.textLabel!.text = object
        return cell
    }
}

    extension MasterViewController: UISearchResultsUpdating {
    func searchBarIsEmpty() -> Bool {
        return searchController.searchBar.text?.isEmpty ?? true
    }
    func isFiltering() -> Bool {
        return searchController.isActive && !searchBarIsEmpty()
    }
    func updateSearchResults(for searchController: UISearchController) {
        if !searchBarIsEmpty() {
            let searchText = searchController.searchBar.text!
            DataSource.shared.filterData.removeAll(keepingCapacity: false)
            DataSource.shared.filterData = DataSource.shared.data.filter({$0.lowercased().contains(searchText.lowercased())})
        }
        tableView.reloadData()
    }
}

    //  DetailViewController.swift
import UIKit

class DetailViewController: UIViewController {

    @IBOutlet weak var detailDescriptionLabel: UILabel!


    func configureView() {
        // Update the user interface for the detail item.
        if let detail = detailItem {
            if let label = detailDescriptionLabel {
                label.text = detail
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        configureView()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    var detailItem: String! {
        didSet {
            // Update the view.
            configureView()
        }
    }
}

//  DataSource.swift
import Foundation

    class DataSource {
    static let shared = DataSource()
    let data: [String] = ["1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4"]
    var filterData: [String] = []
}

#4

Код выслал!
Надеюсь сможете что-то посоветовать, а то уже попробовал много способов, на сколько я знаю, что после searchUpdate создается новый viewController и как понимаю, мы уже переходим с него, а не с обычной таблицы, может поэтому к нему не идет навигационный контроллер!?


#5

Я не работал с UISearchController’ом, поэтому полностью что-то подсказать не смогу. Но я могу предположить, что у него должен быть делегат с методом выбора результата из списка. Если таковой имеется, то сделать логику перехода в нем, так же как в обычной таблице через performSegue().
По сути вам нужно что бы все действия в поиске возвращались в MasterViewController, тогда вы сможете делать все как обычно.


#6

Как я понимаю, что все методы определенные в мастере работают и с новым контроллером, созданным автоматически при поиске, и метод segue( ) передает данные как нужно, грубо говоря это cell.text который отображается в label на detailcontroller, вопрос, как можно тогда явно передать leftbutton c возвратом к master?!


#7

Можете показать весь MasterViewController?


#8

Вы имеете ввиду весь код? Я не понял Вас!
Если код, то выложен


#9

Все, понял. Не обраатил внимания на то, что там идет наследование от UITableViewController. Просто не видел в коде перехода на DetailViewController.


#10

Нужно добавить в detailViewController

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(true, animated: animated)
    }

Так теперь при возврате в master у меня пропадает search bar!!!


#11

true замени на false

override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(false, animated: animated)
}


#12

Ахах, спасибо) эт даже забавно сейчас наблюдать, какие глупые вопросы задавал)