в StoryBoard
NavigationController -> TableViewController -> ViewController
Пре переходе с TableView по cell все хорошо, navigation bar на месте, левая кнопка работает и можно спокойно вернуться, но как только осуществляю поиск, и перехожу по cell, переход осуществляется, но navigation bar пропадает!!!
Что я сделал не так!!! Прошу ПОМОЩИ!!!
После updateSearchResults при переходе пропадает navigation bar
Слишком мало информации. Из вашего описания не понятно как поиск реализован. Скрины, код.
Проект 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] = []
}
Код выслал!
Надеюсь сможете что-то посоветовать, а то уже попробовал много способов, на сколько я знаю, что после searchUpdate создается новый viewController и как понимаю, мы уже переходим с него, а не с обычной таблицы, может поэтому к нему не идет навигационный контроллер!?
Я не работал с UISearchController’ом, поэтому полностью что-то подсказать не смогу. Но я могу предположить, что у него должен быть делегат с методом выбора результата из списка. Если таковой имеется, то сделать логику перехода в нем, так же как в обычной таблице через performSegue().
По сути вам нужно что бы все действия в поиске возвращались в MasterViewController, тогда вы сможете делать все как обычно.
Как я понимаю, что все методы определенные в мастере работают и с новым контроллером, созданным автоматически при поиске, и метод segue( ) передает данные как нужно, грубо говоря это cell.text который отображается в label на detailcontroller, вопрос, как можно тогда явно передать leftbutton c возвратом к master?!
Все, понял. Не обраатил внимания на то, что там идет наследование от UITableViewController. Просто не видел в коде перехода на DetailViewController.
Нужно добавить в detailViewController
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(true, animated: animated)
}
Так теперь при возврате в master у меня пропадает search bar!!!
true замени на false
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(false, animated: animated)
}