gpt4 book ai didi

ios - 更改从代码初始化的 View Controller 时如何修复消失的选项卡栏 Controller

转载 作者:行者123 更新时间:2023-11-30 10:52:14 29 4
gpt4 key购买 nike

我正在努力解决这个问题,即当我切换与推送连接连接的 View Controller 时,一切都会按预期工作。问题是我有一个从代码执行 TableView Controller 的搜索栏,当我从该 TableView Controller 中选择单元格时,下一个 View Controller 没有选项卡栏。

我使用 TableView Controller 作为显示搜索栏结果的 View 。当我选择单元格(搜索结果)时,我将更改显示结果的 View Controller 。但这是根据 Storyboard完成的。我知道从代码执行的 TableView Controller 不会通过导航栏“继承”以前的 Controller 的选项卡栏。但这应该从代码中执行。

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
}
}

}
}

此外,在详细 View Controller 中,我必须以编程方式创建导航栏,以防转场来自搜索结果 Controller 。

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)
}

以下是 Storyboard连接的屏幕截图。这个没有导航栏的 Storyboard当然就是这个 SearchResultController (显示结果并切换到详细信息 Controller 的 TableView Controller )。

storyboard expected failed将选项卡栏设置为根 Controller 或其他东西的最佳方法是什么。我只需要选项卡栏位于所有 View Controller 中,无论 Controller 是从 Storyboard还是代码初始化,都无关紧要。

我一整天都在尝试解决这个问题,但我不知道该怎么做..我感谢每一个帮助!

谢谢!

最佳答案

好的,问题出在 Segues 上。我尝试从另一个 Controller 传递值,该 Controller 与前一个 Controller 没有任何共同点,因此很明显导航栏和选项卡栏不存在。在处理单独的可搜索 View Controller 时,应该添加委托(delegate),以将值传递回主 Controller 。当与可搜索 View Controller 交互时,在我的例子中将值传递给另一个 View Controller 的过程如下所示:

  1. 当我开始在主 Controller 上输入内容时,会出现新的可搜索 View Controller
  2. 当我找到我需要的项目时,我会通过 didSelectedRowAt 选择它
  3. 我通过委托(delegate)函数传递所选值
  4. 添加了委托(delegate)到主 Controller ,从哪里应该完成segue

现在它像预期的那样工作了。

简单的代码如下所示:

protocol SearchTableDelegate {
func passSelectedValue(selected stock: String)
}

在可搜索 View Controller 中声明:

var delegate: SearchTableDelegate!

在 DidSelectedRowAt 中:

delegate.passSelectedValue(selected: selectedValue)

现在在主 Controller 中:

class MainTableViewController: UITableViewController, SearchTableDelegate {...}

并使用协议(protocol)中的函数:

    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)
}
}

此外,在 MainController 中声明 SearchableViewController 时,不要忘记将 Searchable 的委托(delegate)分配给 self:

searchableTableController.delegate = self

关于ios - 更改从代码初始化的 View Controller 时如何修复消失的选项卡栏 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54334705/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com