2017-03-15 25 views
4

這是我第一次製作一個iCloud應用程序,我正在關注如何設置一個iCloud應用程序this tutorial(和this supplemental tutorial)。它所做的只是接受文本(通過「文本視圖」對象),並將該文本(通過UIButton)保存到存儲在iCloud中的文檔中。我已經到了教程的最後,當我測試它時,它崩潰了。那麼,我不應該說「崩潰」,因爲當我測試了其他應用程序時,Xcode結束了測試,這在這裏不是這種情況。該應用程序繼續運行,但我無法做任何事情(我不能寫任何文本或用「保存」按鈕保存)。爲什麼這個簡單的iCloud存儲應用程序失敗?

下面是ViewController.swift

import UIKit 

class ViewController: UIViewController 
{ 
    @IBOutlet weak var textView: UITextView! 

    var document: MyDocument? 
    var documentURL: URL? 
    var ubiquityURL: URL? 
    var metaDataQuery: NSMetadataQuery? 



    func metadataQueryDidFinishGathering(notification: NSNotification) -> Void 
    { 
     let query: NSMetadataQuery = notification.object as! NSMetadataQuery 

     query.disableUpdates() 

     NotificationCenter.default.removeObserver(self, 
                name: NSNotification.Name.NSMetadataQueryDidFinishGathering, 
                object: query) 

     query.stop() 

     let resultURL = query.value(ofAttribute: NSMetadataItemURLKey, 
            forResultAt: 0) as! URL 

     if query.resultCount == 1 { 
      let resultURL = query.value(ofAttribute: NSMetadataItemURLKey, 
             forResultAt: 0) as! URL 

      document = MyDocument(fileURL: resultURL as URL) 

      document?.open(completionHandler: {(success: Bool) -> Void in 
       if success { 
        print("iCloud file open OK") 
        self.textView.text = self.document?.userText 
        self.ubiquityURL = resultURL as URL 
       } else { 
        print("iCloud file open failed") 
       } 
      }) 
     } else { 
      document = MyDocument(fileURL: ubiquityURL!) 

      document?.save(to: ubiquityURL!, 
          for: .forCreating, 
          completionHandler: {(success: Bool) -> Void in 
          if success { 
           print("iCloud create OK") 
          } else { 
           print("iCloud create failed") 
          } 
      }) 
     } 
    } 



    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     let filemgr = FileManager.default 

     ubiquityURL = filemgr.url(forUbiquityContainerIdentifier: nil) 

     guard ubiquityURL != nil else { 
      print("Unable to access iCloud Account") 
      print("Open the Settings app and enter your Apple ID into iCloud settings") 
      return 
     } 

     ubiquityURL = ubiquityURL?.appendingPathComponent(
      "Documents/savefile.txt") 

     metaDataQuery = NSMetadataQuery() 

     metaDataQuery?.predicate = 
      NSPredicate(format: "%K like 'savefile.txt'", 
         NSMetadataItemFSNameKey) 
     metaDataQuery?.searchScopes = 
      [NSMetadataQueryUbiquitousDocumentsScope] 

     NotificationCenter.default.addObserver(self, 
               selector: #selector(
               ViewController.metadataQueryDidFinishGathering), 
               name: NSNotification.Name.NSMetadataQueryDidFinishGathering, 
               object: metaDataQuery!) 

     metaDataQuery!.start() 
    } 

    @IBAction func saveDocument(_ sender: AnyObject) 
    { 

     document!.userText = textView.text 

     document?.save(to: ubiquityURL!, 
         for: .forOverwriting, 
         completionHandler: {(success: Bool) -> Void in 
         if success { 
          print("Save overwrite OK") 
         } else { 
          print("Save overwrite failed") 
         } 
     }) 
    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

代碼下面是輸出,當應用程序 「崩潰」:

2017-03-15 15:12:06.531223 Gaethr2[2708:734758] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMetadataQuery valueOfAttribute:forResultAtIndex:]: index (0) out of bounds (0)' 
*** First throw call stack: 
(0x1876951b8 0x1860cc55c 0x187695100 0x188125460 0x100102ffc 0x10010457c 0x18762eb10 0x18762e214 0x18762df90 0x18769db8c 0x18756fe64 0x1880a4e0c 0x188123268 0x18762eb10 0x18762e214 0x18762df90 0x18769db8c 0x18756fe64 0x1880a4e0c 0x19940d3e4 0x19940f29c 0x187642a44 0x187642240 0x187640094 0x18756e2b8 0x189022198 0x18d5b57fc 0x18d5b0534 0x100107720 0x1865515b8) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

而這裏的潛在問題的一些截圖:

enter image description here

Xcode希望我擺脫「let resultURL」所以我做了(如下所示),希望能解決這個問題,但事實並非如此。

enter image description here

我真的從我深入這裏,因此我只要按照教程。我真的很感謝一些幫助。讓我知道是否需要添加更多信息。我不知道問題是什麼,所以我可能會忽略一些重要的信息。

回答

1

刪除這一行:

let resultURL = query.value(ofAttribute: NSMetadataItemURLKey, 
           forResultAt: 0) as! URL 
0

你有斷點的行讀取第一個結果(索引0)而不檢查是否有任何結果(你在後續行檢查)。

我猜你沒有收到你的查詢結果。當你準備好時,你應該看看你設置的條件,如果你期望的數據確實存在,你也可以看看iCloud。

+0

謝謝您的幫助!你可以添加一些示例代碼嗎?我如何檢查是否有任何結果?檢查後續行是否有錯誤的行爲?我沒有寫這個代碼,而是一個教程,所以我不能100%確定發生了什麼。我如何查看條件,以及如何查看iCloud以查看是否有數據? –

+0

如果query.resultCount> 0會告訴你是否有結果。如果條件或者(如travis建議的那樣)可以完全刪除它,因爲你似乎並不需要它。 –

相關問題