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

Posted

技术标签:

【中文标题】使用动态原型单元将 CloudKit 记录从 TableViewController A 传递到 TableViewControllerB【英文标题】:Passing CloudKit records from TableViewController A to TableViewControllerB on segue with dynamic prototype cells 【发布时间】:2018-10-30 00:18:40 【问题描述】:

我能够使用来自 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

    当用户执行前导滑动时,将该项目添加到列表中 (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

    此列表仅在用户点击TableViewController A上点击导航项时(未选择单元格)。 Segue "showList" 已在故事板中实现,从导航项到 TableViewController B。

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

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

感谢您的时间和建议!

【问题讨论】:

【参考方案1】:

是的,我会使用你提到的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 的segue。

【讨论】:

以上是关于使用动态原型单元将 CloudKit 记录从 TableViewController A 传递到 TableViewControllerB的主要内容,如果未能解决你的问题,请参考以下文章

iOS swift:使用 coredata (cloudkit) 存储缓存

CloudKit:将记录从开发转移到生产

带有故事板原型的 UITableViewCell 子视图的动态大小

CloudKit 返回太多记录

Xcode 8 不允许我编辑动态原型单元格?

CloudKit 从 OSX 中的记录 ID 获取实际对象