web-dev-qa-db-ja.com

UIActivityViewController UIActivityViewControllerCompletionWithItemsHandler

  • リストアイテム

Swiftを使用して、ユーザーが選択した「共有」メソッドの結果をキャプチャするためにUIActivityViewControllerの完了ハンドラーを作成する必要があります。

これは私がこれまで持ってきたコードの断片です。私の質問は、avc.completionWithItemsHandler?シンプルだと思いますが、見えません。

var activityItems = NSMutableArray()
activityItems.addObject("Email or text for 'share' goes here")

var avc = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
avc.setValue("Subject for Email", forKey: "Subject")

avc.completionWithItemsHandler = //Here is where I dont know what to do.

self.navigationController?.presentViewController(avc, animated: true, completion: nil)
23
Custom_Software

CompletionWithItemsHandler typealias:

typealias UIActivityViewControllerCompletionWithItemsHandler = (String?, Bool, [AnyObject]?, NSError?) -> Void

注:前のコードブロックはプロジェクトでは使用されません。必要なクロージャのタイプ( docs )が表示されるだけです。

これらは、完了ハンドラーに渡されるパラメーターであり、これを使用して実行できるため、完了ハンドラーは次のようになります。

avc.completionWithItemsHandler = { activity, success, items, error in 

}
37
Ian

注:質問の「Swift」の部分を読んでいないため、Obj-Cで質問に回答しました。悪いことに、OPに申し訳ありません

これは実際にコンパイルできるより完全な答えです。私が使用した:dispatch_asyncアラートを実行して、「activityType」が最終的に何であるかを確認できるようにします。

avc.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
    dispatch_async(dispatch_get_main_queue(), ^{
        UIAlertViewQuick(@"Activity Status", activityType, @"OK");
    });
    if (completed)
    {
        NSLog(@"The Activity: %@ was completed", activityType);
    }
    else
    {
        NSLog(@"The Activity: %@ was NOT completed", activityType);
    }
};
12
Jann

この答え が言うように、Swift 3および4およびiOS 10および11の場合、次のように使用します。

activityVC.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in

}

present(activityVC, animated: true, completion: nil)
2
Joel Márquez

これはかなり前に回答されましたが、不足している情報と非スイフト情報が混在しているので、完了ハンドラのより完全な例を必要としている人に役立つことを期待して、これが私のバージョンです:

    avc.completionWithItemsHandler = {[weak self](activityTypeChosen, completed:Bool, returnedItems:[AnyObject]?, error:NSError?) -> Void in

        // ReturnedItems is an array of modified NSExtensionItem, or nil of nothing modified
        // if (activityType == nil) User dismissed the view controller without making a selection.

        // Dismiss the view controller we presented
        // (assume a reference to it was stored in self.activityVC)
        self?.activityVC?.dismissViewControllerAnimated(true, completion: {
            if activityTypeChosen == nil {
                NSLog("User canceled without choosing anything")
            }
            else if completed {
                NSLog(")User chose an activity and iOS sent it to that other app/service/whatever OK")
            }
            else {
                NSLog("There was an error: \(error)")
            }
        })
    }

ビューコントローラーを閉じる行に注意してください。 UIActivityViewControllerのドキュメントは、アプリがVC andそれを却下することを提示することの両方に責任があることを非常に明確に述べています。

0
Bill Patterson