2017-03-15 9 views
4

Dies ist mein erstes Mal eine icloud App machen, und ich bin nach this tutorial (und this supplemental tutorial wie eine icloud App einzurichten). Es wird nur Text akzeptiert (über ein "Text View" -Objekt) und dieser Text (über eine UIButton) in einem Dokument gespeichert, das in iCloud gespeichert wird. Ich bin am Ende des Tutorials angelangt, und wenn ich es teste, stürzt es ab. Nun, ich sollte nicht "Absturz" sagen, denn wenn ich andere Apps getestet habe, beendet Xcode den Test, was hier nicht der Fall ist. Die App läuft weiter, aber ich kann nichts machen (ich kann keinen Text schreiben oder mit dem "Speichern" Button speichern).Warum schlägt diese einfache iCloud-Speicher-App fehl?

Hier ist der Code für 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. 
    } 


} 

Hier ist der Ausgang, wenn die App "abstürzt":

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 

Und hier einige Screenshots des potenziellen Problems ist:

enter image description here

Xcode wollte, dass ich von „lassen resultURL“ loswerden also tat ich (wie unten zu sehen), in der Hoffnung, dass das das Problem beheben würde, aber es tat es nicht.

enter image description here

Ich bin hier aus meiner Tiefe wirklich, daher mein einfach ein Tutorial folgen. Ich würde wirklich etwas Hilfe schätzen. Lassen Sie mich wissen, ob ich weitere Informationen hinzufügen muss. Ich weiß nicht, was das Problem ist, also hätte ich einige wichtige Informationen auslassen können.

Antwort

1

diese Zeile löschen:

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

Die Linie, wo Sie Ihren Haltepunkt haben das erste Ergebnis (Index 0) liest, ohne zu überprüfen, ob es irgendwelche Ergebnisse waren (die Sie auf einer der folgenden Zeile überprüfen Sie).

Ich vermute, Sie keine Ergebnisse aus der Abfrage erhalten haben. Sie sollten sich die Bedingungen ansehen, die Sie bei der Vorbereitung festgelegt haben, und sich auch iCloud ansehen, wenn die von Ihnen erwarteten Daten tatsächlich vorhanden sind.

+0

Vielen Dank für Ihre Hilfe! Können Sie bitte einen Beispielcode hinzufügen? Wie kann ich prüfen, ob Ergebnisse vorliegen? Ist das Überprüfen einer nächsten Zeile falsch? Ich habe diesen Code nicht geschrieben, es ist eher ein Tutorial, also bin ich mir nicht 100% sicher, was vor sich geht. Wie betrachte ich die Bedingungen und wie schaue ich auf iCloud nach, ob Daten vorhanden sind? –

+0

Wenn query.resultCount> 0 wird Ihnen sagen, ob es irgendwelche Ergebnisse gibt. Sie können diese Zeile entweder mit der Bedingung konditionieren oder (wie es travis vorgeschlagen hat) sie vollständig entfernen, da Sie sie scheinbar nicht brauchen. –

Verwandte Themen