如何修复消失的标签栏控制器的时候,改变视图控制器从初始化代码

问题描述 投票:0回答:1

我用这是当我切换与推赛格瑞然后一切正常连接视图控制器的问题所困扰。的问题是,我有从代码执行表视图控制器,当我从表视图控制器选择该小区的下一个视图控制器没有标签栏搜索栏。

我使用的表视图控制器作为显示从搜索栏结果的看法。当我选择细胞(源于搜索)然后我改变显示结果视图控制器。但是,这是一个从故事板完成。我知道,从代码执行的表视图控制器不“继承”选项卡中,从以前的控制器通过导航栏栏。但是,这应该从代码执行。

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(表视图控制器显示结果,并切换到细节控制器)。

什么是设置为根控制器或什么标签栏的最好方式。我只需要在标签栏在所有视图控制器如果控制器从故事板或代码初始化没有关系。

我想了一整天解决这一问题,但我不知道我该怎么..欣赏每一个帮助!

谢谢!

ios swift xcode uitabbarcontroller uistoryboard
1个回答
0
投票

好吧,这个问题是与塞格斯。我试图从另一个控制器,有什么共同点与以前的一个,这样很明显,导航栏和标签栏是不存在传递值。在处理独立的serchable视图控制器,有应添加委托,传递谷回主控制器。当搜索视图控制器进行交互,程序的值传递给我的情况另一个视图控制器看起来是这样的:

  1. 当我开始我的主控制器输入新检索视图控制器出现
  2. 当我发现我的项目需要通过didSelectRowAt选择它
  3. 我通过委托函数传递选择的值
  4. 从那里应该做SEGUE新增委托给主控制器

现在,它的工作原理就像它应该。

简单的代码如下所示:

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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.