2017-03-15 10 views
4

iCloudアプリを初めて作成しました。this tutorial(iCloudアプリの設定方法は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. 
    } 


} 

のためのコードは、ここで出力だだ:

enter image description here

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 

そしてここでは、潜在的な問題のいくつかのスクリーンショットです

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の場合、結果があるかどうかがわかります。その行を条件付きで条件付きにするか、(トラヴィスが示唆するように)それを必要としないので完全に削除することができます。 –

関連する問題