Я борюсь с проблемой, которая заключается в том, что когда я переключаю контроллеры представления, связанные с push segue, тогда все работает, как ожидалось.Проблема в том, что у меня есть панель поиска, которая выполняет контроллер табличного представления из кода, и когда я выбираю ячейку из этого контроллера табличного представления, следующий контроллер представления не имеет панели вкладок.
Я использую Table View Controller как представление, которое отображает результаты из панели поиска.Когда я выбираю ячейку (результат поиска), я меняю контроллер представления, показывающий результаты.Но это сделано из раскадровки.Я знаю, что контроллер представления таблицы, выполняемый из кода, не «наследует» панель вкладок от предыдущих контроллеров через панель навигации.Но этот код должен быть выполнен из кода.
Инициализировать контроллер результатов поиска
override func viewDidLoad() {
super.viewDidLoad()
self.definesPresentationContext = true
tableView.separatorStyle = .none
self.extendedLayoutIncludesOpaqueBars = true
refreshControlUI = Refresher.configureRefresher()
tableView.refreshControl = refreshControlUI
refreshControlUI.addTarget(self, action: #selector(pullToRefresh), for: .valueChanged)
// Initialize search table
let priceSearchTable = storyboard?.instantiateViewController(withIdentifier: "CoinSearchTable") as! CoinSearchTableViewController
// asignle pricetable as a search results controller
resultSearchController = UISearchController(searchResultsController: priceSearchTable)
resultSearchController?.searchResultsUpdater = priceSearchTable
// Make navigation bar large
self.navigationController?.navigationBar.prefersLargeTitles = true
self.navigationController?.navigationItem.largeTitleDisplayMode = .never
self.navigationItem.searchController = resultSearchController
// customize search bar
let searchBar = resultSearchController!.searchBar
searchBar.sizeToFit()
searchBar.placeholder = "Search for coins"
resultSearchController?.hidesNavigationBarDuringPresentation = false
resultSearchController?.dimsBackgroundDuringPresentation = true
}
Этот код отвечает только за передачу значений выбранному контроллеру представления.
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if shownAllCoins.count > 0 {
let coinString = shownAllCoins[indexPath.row]
picked = PickedCoin(symbols: [coinString])
picked.delegate = self
navigationController?.setNavigationBarHidden(false, animated: true)
picked.getDetail(name: coinString)
coin = picked.coins[0]
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToDetailsFromSearch" {
if let coin = sender as? [Any]{
if let SearchVC = segue.destination as? DetailPriceViewController{
SearchVC.coin = coin[0] as? Coin
SearchVC.isFromSearching = coin[1] as! Bool
}
}
}
}
Также в подробном контроллере представления Мне пришлось программно создать панель навигации в случае, если переход был из контроллера результатов поиска.
func addNavBar() {
view.backgroundColor = UIColor(hex: 0x001f3e)
let navBar: UINavigationBar = UINavigationBar(frame: CGRect(x: 0, y: 20, width: view.frame.size.width, height: 44))
navBar.barTintColor = UIColor(hex: 0x001f3e)
navBar.isTranslucent = false
self.view.addSubview(navBar);
guard let coin = coin else {return}
let navItem = UINavigationItem(title: "\(coin.symbol)")
let backButton = UIButton(type: .custom)
let textAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white]
navBar.titleTextAttributes = textAttributes
saveButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.bookmarks, target: self, action: #selector(self.selectorName(_ :)));
backButton.setTitle("Back", for: .normal)
backButton.setTitleColor(backButton.tintColor, for: .normal) // You can change the TitleColor
backButton.addTarget(self, action: #selector(self.backAction(_:)), for: .touchUpInside)
navItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
navItem.rightBarButtonItem = saveButton
navBar.setItems([navItem], animated: false)
}
Ниже приведен скриншот подключения раскадровки.Эта раскадровка без навигационной панели - это, конечно, SearchResultController
(контроллер табличного представления, который отображает результаты и переключается на подробный контроллер).
Как лучше всего настроить вкладкубар в качестве корневого контроллера или что-то.Мне просто нужно, чтобы панель вкладок была во всех представлениях контроллера. Не имеет значения, инициализируются ли контроллеры из раскадровки или кода.
Я пытаюсь весь день это исправить, но я не знаю как ... ЯСпасибо за любую помощь!
Спасибо!