使用动态原型单元在Segue上将CloudKit记录从TableViewController A传递到TableViewControllerB

时间:2018-10-30 00:18:41

标签: ios swift segue cloudkit

我能够用CloudKit(var restaurants: [CKRecord] = [])中的记录填充TableViewController A,但是由于两个控制器都有动态原型单元,因此不确定如何将[CKRecord]的子集传递到TableViewController B >,并定义了各自的视图单元格as UITableViewCell。此外, segue仅应在用户点击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] = []

覆盖func tableView(_ tableView:UITableView,LeadingSwipeActionsConfigurationForRowAt 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上的导航项时此列表才可见(在选择单元格时不可见)。从导航项到TableViewController B,故事板中都实现了Segue "showList"

简而言之,TableViewController B是从TableViewController A保存的餐厅(名称,图像)的列表。

我应该使用func prepare(for segue: UIStoryboardSegue, sender: Any?)还是将这次刷卡保存到云中并在TableViewController B中再次获取?

感谢您的时间和建议!

1 个答案:

答案 0 :(得分:0)

是的,正如您提到的,我将使用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