2017-08-23 7 views
0

私は以前のファイルマネージャを新しいUIDocumentBrowserViewControllerに置き換えた既存のObjective-Cドキュメントベースのアプリケーションを持っていますが、テンプレートチューザで新しいドキュメントを作成する方法が全く分かりません。 WWDC 2017のビデオ「iOSの11でビルグレートドキュメントベースのアプリ」によると、あなたはこのようにそれに近づく必要があります。私には意味をなさない何iOS 11 - UIDocumentBrowserViewControllerテンプレートセレクタで新しい文書を作成する方法

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

テンプレートセレクタを提示しているが、何が意味がありませんテンプレートチューザーに「完了」ボタンと「キャンセル」ボタンがあります。ユーザーがテンプレート選択ダイアログで「完了」または「キャンセル」をタップし、それをデリゲート関数に渡すとどうすればわかりますか?誰もこれを(できれば)Objective-Cで取り除く方法を知っていますか? (しかし、スウィフトも大丈夫です。このプロセスの仕組みを理解しようとしています)多くのありがとうございます。

答えて

0

あなたはObjective-Cを好んで尋ねましたが、これはSwiftのオプションパターンの例です。 presentTemplateChooserメソッドがtemplateURLなしで完了クロージャを呼び出した場合(つまり、nilの場合)、templateURLのアンラッピングは失敗します(let templateURL = templateURLがfalseを返す場合)。

あなたが明示的に押され、ユーザがキャンセルかどうかを知りたい場合は、あなたは、このようなことが可能です。

は、このようなキャンセルアクションを作成します。

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

あなたの質問内のメソッドは、その後、次のようになります。

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

これはObjective-Cですべて実行できます。 templateURLをアンラッピングする代わりにnilをチェックするだけで済みます。 (つまり、templateURL = templateURLの代わりにtemplateURL!= nilの場合)。

関連する問題