2017-03-24 5 views
0

私はUITextViewとUIButtonを使用して、ユーザーが入力したテキストをiCloudに保存する簡単なiPhoneアプリケーションを作成しようとしています。私はこのようなことは一度もしていないので、私はthis tutorialに従っています。これまでのところ、彼らのチュートリアルは、これまで完璧に私のために働いていました。アプリケーションはうまく構築され、iPhoneで動作し、テキストを入力する場所を表示し、テキストをiCloudに保存するボタンを表示します。しかし、私はテキスト、このメッセージでアプリがクラッシュ入力する画面をタップ:「キャッチされない例外」とは何ですか?

2017年3月24日08:45:56.093572 Gaethr2 [6342:1419021]キャッチされない例外により「NSInvalidArgumentException」にアプリを終了*を、理由: '* - [NSMetadataQuery valueOfAttribute:forResultAtIndex:]:範囲外のインデックス(0)(0)' ***まずスローコールスタック: (0x184b611b8 0x18359855c 0x184b61100 0x1855f1460 0x100056ffc 0x10005857c 0x184afab10 0x184afa214 0x184af9f90 0x184b69b8c 0x184a3be64 0x185570e0c 0x1855ef268 0x184afab10 0x184afa214 0x184af9f90 0x184b69b8c 0x184a3be64 0x185570e0c 0x1968d93e4 0x1968db29c 0x184b0ea44 0x184b0e240 0x184b0c094 0x184a3a2b8 0x1864ee198 0x18aa817fc 0x18aa7c534 0x10005b720 0x183a1d5b8) のlibC++ abi.dylib:UNCAで終了タイプNSExceptionのught例外 デバッガからのメッセージ:k個のパケット

ここでのViewControllerコードです送信に失敗しました:ここ

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. 
    } 


} 

をここでMyDocument.Swift

import UIKit 

class MyDocument: UIDocument 
{ 
    var userText: String? = "Some Sample Text" 

    override func contents(forType typeName: String) throws -> Any 
    { 
     if let content = userText 
     { 

      let length = 
       content.lengthOfBytes(using: String.Encoding.utf8) 
      return NSData(bytes:content, length: length) 
     } 
     else 
     { 
      return Data() 
     } 
    } 

    override func load(fromContents contents: Any, ofType typeName: String?) throws 
    { 
     if let userContent = contents as? Data 
     { 
      userText = NSString(bytes: (contents as AnyObject).bytes, 
           length: userContent.count, 
           encoding: String.Encoding.utf8.rawValue) as? String 
     } 
    } 
} 

ためのコードだことのスクリーンショットですクラッシュ:

enter image description here

ありがとうございました!

答えて

3

キャッチされない例外

は - [NSMetadataQuery valueOfAttribute:forResultAtIndex:]:範囲外のインデックス(0)(0)」

の最初の発生を削除
let resultURL = query.value(ofAttribute: NSMetadataItemURLKey, 
           forResultAt: 0) as! URL 

query.resultsが空の場合は冗長でエラーが発生します

+0

ありがとうございました!なぜ私の質問が投票されると思いますか? –

+0

エラーメッセージがかなり明確で(理由は**と**どこですか)、エラーがクラス 'MyDocument'に関連していないことも明らかであるため、無関係な情報をあまりにも多く投稿したと思います。 – vadian

関連する問題