ios - 如何将 CloudKit 记录数据从 "TableView-Controller B"传递到 "View-Controller C"?

标签 ios swift3 cloudkit pass-data ckrecord

我从我的 CloudKit 获得了记录数据并在 TableViewController-B 上显示成功,但我怎样才能通过 CloudKit's records(strings, images)到下一个 ViewController-C ??ps. not tableViewcontroller-C
我的第一个 TableViewController-B

import UIKit  
import CloudKit  

class BTableViewControoler: UITableViewController {
       var myclouds:[CKRecord] = []
       var imageCache = NSCache<CKRecordID, NSURL>()
       var recordType: String!

    override func viewDidLoad() {
            super.viewDidLoad()

            recordsFromCloud()
        }

func recordsFromCloud() {

    let cloudContainer = CKContainer.default()
     let publicDatabase = cloudContainer.publicCloudDatabase  
        let predicate = NSPredicate(value: true)
        let query = CKQuery(recordType: recordType, predicate: predicate)
        query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

        let queryOperation = CKQueryOperation(query: query)

        queryOperation.desiredKeys = ["name", "address", "GpNumber"]
        queryOperation.queuePriority = .veryHigh
        queryOperation.resultsLimit = 50
        queryOperation.recordFetchedBlock = { (record) -> Void in
            self.myclouds.append(record)
        }

        queryOperation.queryCompletionBlock = { (cursor, error) -> Void in
            if let error = error { print("Failed data - \(error.localizedDescription)")
                 return }
        print("Successfully data")  
        }
        publicDatabase.add(queryOperation)     
    }//fetchRecords End

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

        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return myclouds.count
    }


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


        let newInFo = myclouds[indexPath.row]

        cell.mainLabel.text = newInFo.object(forKey: "name") as? String
        cell.mainNumber.text = newInFo.object(forKey: "GpNumber") as? String
        cell.mainLocation.text = newInFo.object(forKey: "address") as? String
        cell.mainImage.image = UIImage(named: "photoalbum")

        //get image
        if let imageFileURL = imageCache.object(forKey: myclouds.recordID) {

            if let imageData = try? Data.init(contentsOf: imageFileURL as URL){
                cell.mainImage?.image = UIImage(data: imageData)
                }
            }else{

                let publicDatabase = CKContainer.default().publicCloudDatabase
                let fetchRecordsImageOperation =   CKFetchRecordsOperation(recordIDs: [newInFo.recordID])
                fetchRecordsImageOperation.desiredKeys = ["image"]
                fetchRecordsImageOperation.queuePriority = .veryHigh

                fetchRecordsImageOperation.perRecordCompletionBlock = {
                    (record, recordID, error) -> Void in

                    if let error = error {
                        print("Failed image:\(error.localizedDescription)")
                        return
                    }

                    if let newinfoRecord = record {
                        OperationQueue.main.addOperation() {
                    if let image = newinfoRecord.object(forKey: "image") {
                                let imageAsset = image as! CKAsset


                    if let imageData = try? Data.init(contentsOf: imageAsset.fileURL) {
                                    cell.mainImage.image = UIImage(data: imageData)
                                }

             self.imageCache.setObject(imageAsset.fileURL as NSURL, forKey: newInFo.recordID)

                            }
                         }
                    }//record end
                  }

             publicDatabase.add(fetchRecordsImageOperation)
          }//else end

          return cell
          }//cell end


//Segue To Next View 
       override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "showDetailSegue" {
                if let indexPath = tableView.indexPathForSelectedRow {
                   let toDetailVC = segue.destination as! showDetailVC
                        toDetailVC.DisData = newinfo[indexPath.row]       
                }

我的 View Controller -C
import UIKit
import CloudKit

class showDetailVC: UIViewController {

    @IBOutlet weak var detailpic: UIImageView!

    @IBOutlet weak var containerView: UIView!

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var infoLabel: UILabel!
    @IBOutlet weak var mynumberLabel: UILabel!

    var DisData: CKRecord?
    var getType: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        detailpic.image = UIImage(named: "photoalbum")
        infoLabel.text = DisData?.object(forKey: "address") as? String
        nameLabel.text = DisData?.object(forKey: "name") as? String
        mynumberLable.text = DisData?.object(forKey: "GpNumber") as? String   
    }


}

我使用 var DisData获取 CKRecord来自 tableViewController-B但它不适用于 DisData?.object(forKey: "name") as? String 的方法
并且图像也无法弄清楚如何显示它。
我应该使用 UITableViewController-B's func recordsFromCloudViewController-C再次???或任何其他获得 Cloudkit's records 的聪明方法, 请帮忙。

最佳答案

创建一个名为 selectedRecord 的变量

var selectedRecord: CKRecord!

添加委托(delegate)方法 didSelectRowatindexPath
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: IndexPath) {

    selectedRecord = myclouds[indexPath.row]
performSegueWithIdentifier("showDetailSegue", sender: nil)

}

将 prepareforsegue 更改为此
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                if segue.identifier == "showDetailSegue" {
                       let toDetailVC = segue.destination as! showDetailVC
                            toDetailVC.DisData = selectedRecord       
                    }

CKRecord? 更改 DisData 的类型至CKRecord!showDetailVC
var DisData: CKRecord!

如果你想得到你的 key ,声明queryOperation recordsFromCloud()
然后,在 showDetailVC 中创建一个变量 forKeys
var forKeys: [String]!

并将以下行添加到 prepareforsegue
toDetailVC.forKeys = queryOperation.desiredKeys

关于ios - 如何将 CloudKit 记录数据从 "TableView-Controller B"传递到 "View-Controller C"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44865048/

相关文章:

ios - AVPlayer 从 url 加载缓慢

ios - 在 Swift 3 中使用选择器

ios - 在 Swift 3 中更改状态栏背景颜色

ios - CloudKit - NSPredicate 用于在引用列表中查找包含指定 CKReference 的所有记录

swift - 向下滚动加载更多记录

ios - 在 CloudKit 谓词中使用 CONTAINS 或 ANY 以及比较数组

iOS:在设备上永久存储身份验证数据

ios - 具有 204 响应且 Objective-C 中没有内容的 DELETE 请求的巨大延迟

ios - 无法使脚本 'run-sonar-swift' 工作

swift - 为什么 ImageView 有时不会出现在 Collection View 单元格中?