2013-05-22 15 views
6

"ソーシャル"フレームワークを使用して、すべてのソーシャルメディアアイコンを表示するモーダルUIActivityViewControllerを表示すると、ユーザーがクリックしたアイコンを正確に見つける方法はありますか?意味、彼らがTwitter、Facebook、Mail、Messageなどを選んだのか?UIActivityViewControllerでどのアイコンがクリックされたかを調べる

私はこのクラスのデリゲートメソッドをDocsで見ることが予想されましたが、何も表示されません。

誰もがアイデアを持っていますか?

答えて

17

UIActivityViewControllerには、completionHandlerというプロパティがあります。このハンドラを実装して通知します。

UIActivityViewController *avc = ...; 
avc.completionHandler = ^(NSString *activityType, BOOL completed) { 
    if (completed) { 
     NSLog(@"The selected activity was %@", activityType); 
    } 
}; 
+1

投稿が完了した後で、それは私の目的には遅すぎます。私がやっていることは、ユーザーが何らかのテキストを送信しているTweet(またはFacebookの投稿、メールのmsgなど)をあらかじめ入力していることです。ツイート、電子メールなどではテキストの部分が異なりますので、ユーザーがアイコンをクリックするとすぐにプログラムでテキストを変更できます。どのようにそれを行う上の任意のアイデアですか? – sirab333

+0

あなたは元の質問であなたの希望を明確にしたはずです。あなたはもっと良い結果を得ていたでしょう。 http://stackoverflow.com/questions/13551042/different-data-for-sharing-providers-in-uiactivityviewcontroller – rmaddy

+0

リンクをありがとうございます - 私はそれをチェックアウトします! – sirab333

2

以下のスニペットは、私の場合で働いていた:

[activityController setCompletionHandler:^(NSString *act, BOOL done) 
{ 

    NSLog(@"act type %@",act); 
    NSString *ServiceMsg = nil; 
    if ([act isEqualToString:UIActivityTypeMail]) 
    ServiceMsg = @"Mail sent"; 

    if ([act isEqualToString:UIActivityTypePostToTwitter]) 
    ServiceMsg = @"Post on twitter, ok!"; 

    if ([act isEqualToString:UIActivityTypePostToFacebook]) 
    ServiceMsg = @"Post on facebook, ok!"; 

    if (done) 
    { 
     UIAlertView *Alert = [[UIAlertView alloc] initWithTitle:ServiceMsg message:@"" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil]; 
     [Alert show]; 
     [Alert release]; 
    } 
    else 
    { 
     // didn't succeed. 
    } 
}]; 
+0

このメソッドは完了メソッドです。しかし、私はFBやwhatsappのようなアイコンをクリックすると、私はクリックイベントを得ることができます。どうすればいいのですか? –

3

completionHandlerは推奨されません。 completionWithItemsHandlerを使用してください。これに基づき

activityController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { 
    NSLog(@"completionWithItemsHandler, activityType: %@, completed: %d, returnedItems: %@, activityError: %@", activityType, completed, returnedItems, activityError); 
}; 
2

SO答え:https://stackoverflow.com/a/34581940/2177085

これをまたのWhatsAppやGmailを介して共有ユーザーでチェックしています。 activityTypeを出力して他のタイプを追加することができます。

let activityViewController = UIActivityViewController(activityItems: [finalMsg as NSString], applicationActivities: nil) 
self.presentViewController(activityViewController, animated: true, completion: nil) 

activityViewController.completionWithItemsHandler = {(activityType, completed:Bool, returnedItems:[AnyObject]?, error: NSError?) in 

// Return if cancelled 
if (!completed) { 
    print("user clicked cancel") 
    return 
} 

if activityType == UIActivityTypeMail { 
    print("share throgh mail") 
} 
else if activityType == UIActivityTypeMessage { 
    print("share trhought Message IOS") 
} 
else if activityType == UIActivityTypePostToTwitter { 
    print("posted to twitter") 
} 
else if activityType == UIActivityTypePostToFacebook { 
    print("posted to facebook") 
} 
else if activityType == UIActivityTypeCopyToPasteboard { 
    print("copied to clipboard") 
} 
else if activityType! == "net.whatsapp.WhatsApp.ShareExtension" { 
    print("activity type is whatsapp") 
} 
else if activityType! == "com.google.Gmail.ShareExtension" { 
    print("activity type is Gmail") 
} 
else { 
    // You can add this activity type after getting the value from console for other apps. 
    print("activity type is: \(activityType)") 
} 
} 
2

スウィフト3

スウィフト3でtypealias UIActivityViewControllerCompletionWithItemsHandlerは、あなたがこのようcompletionWithItemsHandlerを使用することができます

public typealias UIActivityViewControllerCompletionWithItemsHandler = (UIActivityType?, Bool, [Any]?, Error?) -> Swift.Void

に変更。

activityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems:[Any]?, error: Error?) in 
    //Do whatever you want 
} 
関連する問題