Передача массива на новый ViewController

tableviewcontroller
swift
xcode
segue

#1

В сториборде создал два TVC, суть простая На первом два лейбла : Название услуги , Цена. На втором все идентично, хотел при нажатии определенной услуги получать эту же информацию на другом TVC.
1 TVC

import UIKit
    import CoreData
        class TableViewController: UITableViewController {
        @IBAction func unwindToThisViewController(segue: UIStoryboardSegue){ // объявление сегвея для возврата на этот вью
        }
    var Serv:[services]=[
    services(name:"Переустановка Виндовс и чего то там там там тывдадывадвы вьыдвавыаь",price:"2000"),
    services(name:"Чистка ноутбука и тд ывлыдвлвалыальавы ыаьлыав",price: "1000"),
    services(name: "Замена термопасты жвыдьждыьвсждьывсжыжвсыдв", price: "500")
]
override func viewWillAppear(_ animated: Bool) { // включаем свайп
    navigationController?.hidesBarsOnSwipe = true
}
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.estimatedRowHeight = 90
    tableView.rowHeight = UITableViewAutomaticDimension
}
   override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true) //что бы не было выделения на выбранном элементе
}
override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
    }
 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
        return Serv.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell
        cell.NameLabel.text = Serv[indexPath.row].name
        cell.PriceLabel.text = Serv[indexPath.row].price
        return cell
    }
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // объявление сегвея передача данных
        if segue.identifier == "bascetsegue"{
            let indexPath = tableView.indexPathForSelectedRow!
            let dvc = segue.destination as! BascetTableViewController // Thread 1: signal SIGABRT
            dvc.BascetServ = [self.Serv[indexPath.row]]   
            }
        }

2-ой TVC куда собственно передаю данные

import UIKit
class BascetTableViewController: UITableViewController {
var BascetServ : [services] = []
override func viewDidLoad() {
    super.viewDidLoad()
     tableView.estimatedRowHeight = 90   // метод для расширения ячейки
     tableView.rowHeight = UITableViewAutomaticDimension
     tableView.tableFooterView = UIView(frame: CGRect.zero)
 }
 override func didReceiveMemoryWarning() {
     super.didReceiveMemoryWarning()
     // Dispose of any resources that can be recreated.
 }
 // MARK: - Table view data source
 override func numberOfSections(in tableView: UITableView) -> Int {
     return 1
 }
 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return BascetServ.count
 }
 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! BascetTableViewCell
    cell.BascetName.text = self.BascetServ[indexPath.row].name
    cell.BascetPrice.text = self.BascetServ[indexPath.row].price
     return cell
 }
  • В функции override func prepare() выскакивает ошибка, когда пытаюсь совершить переход. Больше недели бьюсь и пытаюсь обойти эту ошибку, да опыта не хватает. Подскажите пожалуйста.

#2
var Serv: [[services]] = [
    [services(name:"Переустановка Виндовс и чего то там там там тывдадывадвы вьыдвавыаь",price:"2000")],
    [services(name:"Чистка ноутбука и тд ывлыдвлвалыальавы ыаьлыав",price: "1000")],
    [services(name: "Замена термопасты жвыдьждыьвсждьывсжыжвсыдв", price: "500")]
]

#3

Переделал как ты написал, следом появилась ошибка в этом же TVC

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell
    cell.NameLabel.text = Serv[indexPath.row].name //Value of type '[services]' has no member 'name'
    cell.PriceLabel.text = Serv[indexPath.row].price // Value of type '[services]' has no member 'price'
    return cell
}

#4

Я не вижу у вас вызова самого перехода на 2 TVC. Где метод performSegue ?
Плюс убедитесь что сам сигвей в IB имеет такое же имя.


#5

Вот сама функция, он в первом TVC снизу

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // объявление сегвея передача данных
            if segue.identifier == "bascetsegue"{
                let indexPath = tableView.indexPathForSelectedRow!
                let dvc = segue.destination as! BascetTableViewController // Thread 1: signal SIGABRT
                dvc.BascetServ = [self.Serv[indexPath.row]]   
                }
            }


#6
cell.NameLabel.text = Serv[indexPath.row].first?.name
cell.PriceLabel.text = Serv[indexPath.row].first?.price

#7

Тут ошибка ушла, но все так же продолжает вылетать ошибка Thread 1: signal SIGABRT

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // объявление сегвея передача данных
        if segue.identifier == "bascetsegue"{
            let indexPath = tableView.indexPathForSelectedRow!
            let dvc = segue.destination as! BascetTableViewController // Thread 1: signal SIGABRT
            dvc.BascetServ = [self.Serv[indexPath.row]]   
            }
        }

#8

уберите NavigationViewController, из-за этого и ругается.


#9

Помогло, спасибо большое :wink:


#10

без этого скрина мы бы долго годали ))