我用这是当我切换与推赛格瑞然后一切正常连接视图控制器的问题所困扰。的问题是,我有从代码执行表视图控制器,当我从表视图控制器选择该小区的下一个视图控制器没有标签栏搜索栏。
我使用的表视图控制器作为显示从搜索栏结果的看法。当我选择细胞(源于搜索)然后我改变显示结果视图控制器。但是,这是一个从故事板完成。我知道,从代码执行的表视图控制器不“继承”选项卡中,从以前的控制器通过导航栏栏。但是,这应该从代码执行。
Initialize Search Result 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
}
This code is responsible just for passing values to selected view controller.
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
}
}
}
}
还详细视图控制器我不得不在编程的情况下创建的导航栏,如果SEGUE是从搜索结果控制器。
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)
}
下面是故事板连接的屏幕截图。这个故事板没有导航栏是当然这qazxsw POI(表视图控制器显示结果,并切换到细节控制器)。
什么是设置为根控制器或什么标签栏的最好方式。我只需要在标签栏在所有视图控制器如果控制器从故事板或代码初始化没有关系。
我想了一整天解决这一问题,但我不知道我该怎么..欣赏每一个帮助!
谢谢!
好吧,这个问题是与塞格斯。我试图从另一个控制器,有什么共同点与以前的一个,这样很明显,导航栏和标签栏是不存在传递值。在处理独立的serchable视图控制器,有应添加委托,传递谷回主控制器。当搜索视图控制器进行交互,程序的值传递给我的情况另一个视图控制器看起来是这样的:
现在,它的工作原理就像它应该。
简单的代码如下所示:
SearchResultController
在检索视图控制器声明:
protocol SearchTableDelegate {
func passSelectedValue(selected stock: String)
}
在DidSelectRowAt:
var delegate: SearchTableDelegate!
现在,在主控制器:
delegate.passSelectedValue(selected: selectedValue)
并使用从协议功能:
class MainTableViewController: UITableViewController, SearchTableDelegate {...}
声明中MainController的SearchableViewController时也不要忘了从检索指派代表自我:
func passSelectedValue(selected value: String) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let destinationVC = storyboard.instantiateViewController(withIdentifier: "details") as? DetailsViewController{
destinationVC.value = value
self.navigationController?.pushViewController(destinationVC, animated: true)
}
}