2016-11-09 114 views
1

我正在研究蘋果今年發佈的新,我有一些疑問。我試圖遵循WWDC的「CloudKit新增功能」視頻,但部分代碼在Xcode中不再適用。如何使用CloudKit的CKShare創建共享?

我想要做的是:用戶將輸入他的姓名和電話,並點擊UIButton後,將與特定的人分享。這裏是代碼:

class ViewController: UIViewController, UICloudSharingControllerDelegate { 
    @IBOutlet weak var nome: UITextField! 
    @IBOutlet weak var telefone: UITextField! 
    @IBOutlet weak var button: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func send(_ sender: AnyObject) { 
     print("Send button was clicked.\n") 

     let elder = CKRecord(recordType: "Elder") 
     elder["name"] = self.name.text as CKRecordValue? 
     elder["telephone"] = self.telephone.text as CKRecordValue? 

     let ckContainer = CKContainer.default() 
     let shareRecord = CKShare(rootRecord: elder) 

     shareRecord[CKShareTitleKey] = "Elder" as CKRecordValue? 

     let shareController = UICloudSharingController(share: shareRecord, container: ckContainer) 
     shareController.delegate = self 
     shareController.availablePermissions = [.allowReadOnly] 
     shareController.popoverPresentationController?.sourceView = self.button 

     self.present(shareController, animated: true) 
    } 

    func cloudSharingController(_ csc: UICloudSharingController, failedToSaveShareWithError error: Error) { 
     print("PROBLEM SAVING SHARE") 
    } 

    func cloudSharingControllerDidSaveShare(_ csc: UICloudSharingController) { 
     print("SHARE SAVED") 
    } 

    func itemTitle(for csc: UICloudSharingController) -> String? { 
     return "a" //don't know what this is for 
    } 
} 

即使CloudSharingController出現,我的應用仍然會打印「問題保存共享」。此外,CKRecord 老年人未顯示在CloudKit的儀表板中。

+0

將print(「PROBLEM SAVING SHARE」)更新爲'print(「PROBLEM SAVING SHARE:\(error)」),這樣你就知道它失敗的原因。 – rmaddy

+0

是的,在我發佈後,我做了正確的......但無論如何,錯誤是:'一個額外的份額正在被保存沒有它的rootRecord()' 。基本上我沒有創建根記錄,但我不明白,根記錄是'老',它就在它的正上方! –

+0

我應該在嘗試創建共享之前保存記錄嗎? –

回答

2

所以,我想通了,什麼是錯的......我用的是雲套件爲您創建的缺省區域,你不能做當使用CKShare時。 您只需創建一個私人定製CKZone並將CKRecord和CKShare保存在其中即可!

+0

默認區域不支持共享自定義區域。 –

1

有人告訴我,只有在共享已創建的情況下,纔可以使用您選擇使用的初始化程序。對於新股,使用備用的init

試試這個代碼:

let csc = UICloudSharingController { controller, 
     preparationCompletionHandler in 
     let share = CKShare(rootRecord: elder) 

     let mro = CKModifyRecordsOperation(
      recordsToSave: [elder, share], 
      recordIDsToDelete: nil) 


     mro.modifyRecordsCompletionBlock = { 
      records, recordIDs, error in 
      if error != nil { 
        //handle error 
      } 
      preparationCompletionHandler(share,CKContainer.default(), error) 
     } 
     myDB.add(mro) 
    } 

    csc.delegate = self 
    self.present(csc, animated:true, completion:nil) 
+0

嘿!我試過你的代碼,但是在'mro.modifyRecordsCompletionBlock'中出現錯誤。我打印出這個錯誤,只是這樣說:'可選(「無法修改某些記錄」),我想,因爲我無法創建一個分享的原因之後,我得到了「問題拯救共享「message error ... –

+0

我還創建了一個閉包,以確保該記錄是第一次創建的,然後調用CKShare方法,但即使這似乎不起作用... –

+0

CloudSharingController顯示沒有問題,但是當我單擊時出現此錯誤任何按鈕分享,例如,「複製鏈接」。 –