В этом случае лучше всего просто нажать контроллер вида программно. Очень простой полный пример будет выглядеть следующим образом:
class ViewController: UIViewController {
let titles: [String] = ["First", "Second", "Third"]
override func viewDidLoad() {
super.viewDidLoad()
}
}
// MARK: - UITableViewDelegate, UITableViewDataSource
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return titles.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
cell.textLabel?.text = titles[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let controller = UIViewController() // or UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "whateverIdentifierISetInStoryboard")
controller.title = titles[indexPath.row]
navigationController?.pushViewController(controller, animated: true)
}
}
Таким образом, использование navigationController?.pushViewController(controller, animated: true)
- это метод, который покажет новый контроллер представления с анимацией справа налево.
Заголовок просто устанавливается непосредственно на контроллере вида, который можно создать из раскадровки с помощью UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "whateverIdentifierISetInStoryboard")
.
Предполагается, что этот контроллер вида уже находится на контроллере навигации.
Если вам действительно нужно сделать это с segues, тогда вам нужно вручную вызвать segue с использованием идентификаторов. Вы также отправляете свой заголовок как параметр sender
.
self.performSegue(withIdentifier: "customerDetails", sender: titles[indexPath.row])
В вашем случае, вероятно, что-то вроде:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item: StockModel = feedItems[indexPath.row] as! StockModel
let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
self.performSegue(withIdentifier: "customerDetails", sender: titleStr)
}
Теперь просто используйте этот заголовок:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "customerDetails" {
let destinationVC = segue.destination as UIViewController
destinationVC.title = sender as? String
}
}
Другой подход - сохранить текущий заголовок свойства, а затем использовать его при подготовке segue:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item: StockModel = feedItems[indexPath.row] as! StockModel
let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
self.nextScreenTitle = titleStr
self.performSegue(withIdentifier: "customerDetails", sender: self)
}
А потом использование:
var nextScreenTitle: String?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "customerDetails" {
let destinationVC = segue.destination as UIViewController
destinationVC.title = nextScreenTitle
}
}