Как исправить исчезновение Tab Bar Controller при изменении View Controller, инициализированного из кода - PullRequest
0 голосов
/ 23 января 2019

Я борюсь с проблемой, которая заключается в том, что когда я переключаю контроллеры представления, связанные с 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 (контроллер табличного представления, который отображает результаты и переключается на подробный контроллер).

storyboard expected failed Как лучше всего настроить вкладкубар в качестве корневого контроллера или что-то.Мне просто нужно, чтобы панель вкладок была во всех представлениях контроллера. Не имеет значения, инициализируются ли контроллеры из раскадровки или кода.

Я пытаюсь весь день это исправить, но я не знаю как ... ЯСпасибо за любую помощь!

Спасибо!

1 Ответ

0 голосов
/ 09 февраля 2019

Хорошо, проблема была с segues.Я пытался передать значение из другого контроллера, который не имеет ничего общего с предыдущим, поэтому было очевидно, что панели навигации и панели вкладок там не было.При работе с отдельным контроллером представления Serchable, необходимо добавить делегирование, чтобы передать значение в главный контроллер.При взаимодействии с доступным для поиска контроллером представления процедура для передачи значения другому контроллеру представления в моем случае выглядит следующим образом:

  1. Когда я начинаю набирать на своем главном контроллере, появляется новый доступный для поиска контроллер представления
  2. Когда я нахожу нужный мне элемент, я выбираю его с помощью didSelectedRowAt
  3. Я передаю выбранное значение через функцию делегата
  4. Добавлен делегат в главный контроллер, откуда следует выполнить segue

Теперь все работает так, как должно.

Простой код выглядит следующим образом:

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

В контроллере с возможностью поиска введите:

var delegate: SearchTableDelegate!

В DidSelectedRowAt:

delegate.passSelectedValue(selected: selectedValue)

сейчасв главном контроллере:

class MainTableViewController: UITableViewController, SearchTableDelegate {...}

и использовать функцию из протокола:

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

Также при объявлении SearchableViewController в MainController не забудьте назначить делегата из Searchable для себя:

searchableTableController.delegate = self
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...