Передача данных из одного TableView в другой TableView

Я настроил метод подготовки к переходу и считаю, что успешно отправил свои данные во второй ViewController, но не знаю, как использовать переданные данные.

Например:

Изображение

Когда пользователь нажимает Белок, который я хочу отправить, выбран второй белок tableViewController, а затем заполняет его массивом белков.

Ниже мой первый код таблицы:

Первое представление таблицы:

class OrdersTableViewController: UITableViewController {
        var titleList = ["Protein","Protein Flavor", "Base", "Base Flavor", "Side", "Additional"]

        // MARK: - Table view data source

        override func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }

        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return titleList.count
        }

        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! OrdersTableViewCell

            cell.cellTitle.text = titleList[indexPath.row]

            // Configure the cell...

            return cell
        }

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if (segue.identifier == "showDetailView") {
                let DVC = segue.destination as! OrderDetailTableViewController

                if let indexpath = self.tableView.indexPathForSelectedRow {
                    let proteins = titleList[indexpath.row] as String
                    DVC.sentData1 = proteins

                    print (proteins)
                }
            }
        }
    }

В настоящее время, если я печатаю отправляемое значение, оно работает. В этом случае он печатает «Белок». Но в идеале это то, что я хочу, но я не уверен, как это сделать.

class OrderDetailTableViewController: UITableViewController {
    var sentData1:String!
    var proteinList = ["Salmon", "Meatballs", "Chicken", "Cod","Sausage", "Frittata"]
    var baseList = ["White Rice", "Brown Rice"]

    //take what is selected from sentData1 and populate second tableview

    if sentData1 == "Protein" {
        //populate tableview with proteinList
    }

    if sentData1 == "Base" {
        //populate tableview with baseList
    }

Все сообщения, которые я нашел, касаются отправки данных TableView в обычный viewController, который я не нашел полезным при попытке его реализовать. Я новичок в Swift, поэтому любые советы приветствуются.


person Nicholas Richardson    schedule 03.10.2017    source источник


Ответы (2)


Похоже, вы используете запуск своего перехода от нажатия в своей раскадровке, вы можете удалить этот триггер и просто иметь эту точку перехода от одного viewController к вашему второму VC. Затем добавьте функцию didSelectCellAtIndexPath:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //save the selectedIndex in a class variable
    selectedIndex = indexPath
    performSegueWithIdentifier("showDetailView", nil)
}

Затем в вашем prepareForSegue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "showDetailView") {
            let DVC = segue.destination as! OrderDetailTableViewController
            DVC.sentData1 = titleList[selectedIndex.row]
        }
    }

Затем:

class OrderDetailTableViewController: UITableViewController {
    var sentData1:String!
    var secondTableViewDataSource : [String] = []
    var proteinList = ["Salmon", "Meatballs", "Chicken", "Cod","Sausage", "Frittata"]
    var baseList = ["White Rice", "Brown Rice"]

//take what is selected from sentData1 and populate second tableview
override func viewDidLoad(){
    super.viewDidLoad()
    switch sentData1 {
    case "Protein":
        secondTableViewDataSource = proteinList
        //you may need to call tableView.reloadData() here too
        break
    default:
        break
    }
}

* Я хотел добавить, так как видел, что вы используете UITableViewController, хотя в этом нет ничего плохого... использование UIViewController и подписка на протоколы UITableViewDataSource/Delegate обеспечили бы гораздо большую гибкость. Я почти никогда не использую настоящие UITableViewControllers

person Jacob Boyd    schedule 03.10.2017

Я предлагаю настроить структуру данных для представления вашей информации, а не нескольких строковых массивов. Вот простой пример:

class Nutrient {
    var kind: String
    var examples: [String]

    init(_ kind: String, examples: [String] = []) {
        self.kind = kind
        self.examples = examples
    }
}

let dataModel = [Nutrient("Protein", examples:["Salmon", "Meatballs", "Chicken", "Cod","Sausage", "Frittata"]),
                 Nutrient("Base", examples:["White Rice", "Brown Rice"])]

При этом вы должны использовать поле питательных веществ kind для заполнения своей первой таблицы и передать массив питательных веществ examples во вторую таблицу. Второй таблице не нужно знать ни о чем, кроме того, что ей задано для отображения.

person Phillip Mills    schedule 03.10.2017
comment
Я согласен, наличие фактической структуры данных сделало бы вашу кодовую базу намного лучше! - person Jacob Boyd; 03.10.2017
comment
где бы я реализовал это, чтобы заставить его работать? мне нравится эта идея - person Nicholas Richardson; 03.10.2017
comment
Это зависит от того, насколько сложны реальные данные. Если это только статическая информация, вы можете сделать это там, где вы сейчас создаете titleList. Для модели данных, в которой пользователь может добавлять/удалять/изменять элементы, вы, вероятно, захотите, чтобы класс менеджера обрабатывал доступ через общий экземпляр. - person Phillip Mills; 04.10.2017