2017-08-23 1 views
0

Ich habe eine Objective-C dokumentbasierte App, wo ich meinen bisherigen Dateimanager durch den neuen UIDocumentBrowserViewController ersetzt habe, und alles funktioniert - außer dass ich absolut nicht weiß, wie man ein neues Dokument mit einem Template-Chooser erstellt. Gemäß der WWDC 2017 Video „Building Große dokumentenbasierte Apps in iOS 11“ Sie sollte es so nähern:iOS 11 - UIDocumentBrowserViewController neues Dokument mit Template Chooser erstellen, wie eingerichtet?

func documentBrowser(_ controller: UIDocumentBrowserViewController, didRequestDocumentCreationWithHandler importHandler: @escaping (URL?, UIDocumentBrowserViewController.ImportMode) -> Swift.Void) 
{ 
presentTemplateChooser(completion: {templateURL, canceled) in 
    if let templateURL = templateURL 
    { 
     importHandler(templateURL, .copy) 
    } 
    else 
    { 
     importHandler(nil, .none) 
    } 
} 

Was Sinn macht, mir die Vorlagenauswahl präsentiert, aber was macht keinen Sinn zu mir ist, habe ich einen "Fertig" und "Abbrechen" Knopf auf dem Vorlagenwähler; Aber woher weiß ich, wenn der Benutzer in der Template-Auswahl auf "Fertig" oder "Abbrechen" klickt und diese an die Delegate-Funktion weiterleitet? Weiß jemand, wie man das in (vorzugsweise) Objective-C abzieht? (Aber Swift ist auch in Ordnung, nur versuchen, eine Vorstellung davon zu bekommen, wie dieser Prozess funktioniert) Vielen Dank.

Antwort

0

Ich weiß, dass Sie nach Objective-C gefragt haben, aber dies ist ein Beispiel für Swifts Optionals Muster. Wenn Ihre Methode "presentTemplateChooser" die Beendigung des Abschlusses ohne templateURL aufruft (d. H. Es ist null), schlägt das Auspacken von templateURL fehl (wenn templateURL = templateURL den Wert false zurückgibt).

Wenn Sie wissen wollen, ob der Benutzer explizit gedrückt abbrechen, können Sie das wie folgt tun:

die Aktion abbrechen erstellen wie folgt aus:

let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in 
     completion(nil, true) 
    } 

Verfahren in Frage sollte dann sein:

func documentBrowser(_ controller: UIDocumentBrowserViewController, didRequestDocumentCreationWithHandler importHandler: @escaping (URL?, UIDocumentBrowserViewController.ImportMode) -> Swift.Void) 
{ 
presentTemplateChooser(completion: {templateURL, canceled) in 
    if canceled { 
     print("User canceled") 
    } 
    if let templateURL = templateURL 
    { 
     importHandler(templateURL, .copy) 
    } 
    else 
    { 
     importHandler(nil, .none) 
    } 
} 

Sie können all dies in Objective-C tun. Sie müssten nur nach nil suchen, anstatt nach templateURL auszupacken. (d. h. wenn templateURL! = nil anstelle von templateURL = templateURL).