Передача записей CloudKit из TableViewController A в TableViewControllerB при работе с динамическими прототипными ячейками - PullRequest
0 голосов
/ 30 октября 2018

Я могу заполнить TableViewController A записями из CloudKit (var restaurants: [CKRecord] = []), но не уверен, как передать подмножество [CKRecord] в TableViewController B, поскольку оба контроллера имеют динамические ячейки прототипа и имеют их соответствующие ячейки вида определены as UITableViewCell. Кроме того, последовательность должна запускаться только тогда, когда пользователь касается элемента навигации в TableViewController A (не при выбранной ячейке).

Вот как я реализовал cellForRowAt

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "dataCell", for: indexPath) as! RestuarantViewCell

   // Configure the cell...
    let restaurant = restaurants[indexPath.row]
    cell.RestNameLabel?.text = restaurant.object(forKey: "name") as? String
    cell.RestDescLabel?.text = restaurant.object(forKey: "desc") as? String

    if let image = restaurant.object(forKey: "image"), let imageAsset = image as? CKAsset {
        if let imageData = try?Data.init(contentsOf: imageAsset.fileURL) {
            cell.RestImageView?.image = UIImage(data: imageData)
        }
    }

    return cell
}
  1. Когда пользователь выполняет пролистывание, добавьте этот элемент в список (var list: [CKRecord] = [])

переопределить функцию tableView (_ tableView: UITableView, leadSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

let addAction = UIContextualAction(style: .normal, title: "Save") { (action, sourceView, completionHandler) in
    //Add to list
    self.list.append(self.restaurants[indexPath.row])
    print(self.list)

    //Delete row and reload tableView i.e. tableView.reloadData()
    self.tableView.deleteRows(at: [indexPath], with: .fade)

    //Call completion handler to dismiss the action button
    completionHandler(true)
}

//Configuring delete button
addAction.backgroundColor = UIColor(red: 76, green: 217, blue: 100)

//Create button for user swipe
let swipeConfiguration = UISwipeActionsConfiguration(actions: [addAction])

return swipeConfiguration

}

  1. Этот список отображается только тогда, когда пользователь нажимает элемент навигации в TableViewController A (не при выбранной ячейке). Segue "showList" был реализован в раскадровке от элемента навигации до TableViewController B.

Короче говоря, TableViewController B - это список ресторанов (название, изображение), сохраненный из TableViewController A

Должен ли я использовать func prepare(for segue: UIStoryboardSegue, sender: Any?) или, возможно, сохранить этот свайп в облаке и извлечь его снова в TableViewController B?

Цените ваше время и предложения!

1 Ответ

0 голосов
/ 14 ноября 2018

Да, я бы использовал prepare for segue, как вы упомянули. Сделайте массив restaurants свойством класса как для таблицы A, так и для таблицы B.

Примерно так:

//Table View Controller A
class TableViewA: UIViewController{
  var restaurants = [CKRecord]()

  override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if segue.identifier == "NameThisInYourStoryboard"{
      let vc = segue.destinationController as! TableViewB
      vc.restaurants = self.restaurants //Pass the data
    }
  }
}

//Table View Controller B
class TableViewB: UIViewController{
  var restaurants = [CKRecord]()
}

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

...