iOS 6 – UIActivityViewController项目

希望大家意识到iOS 6包含了ActionSheet (UIActivityViewController).新风格ActionSheet (UIActivityViewController). UIActivityViewController可以用string,url,图像等参数来启动。下面是这个代码片段(其中items是一个带有string和url参数的数组)。

 UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; 

但是,当我们selectMail,Facebook或Twitter等不同的共享选项时,有什么方法可以分配不同的参数?

一种方法是我们可以实现UIActivityItemSource,我们需要实现源方法

 - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType 

它总是返回一个string值。 但我需要传递一个数组,以便我可以分配像URL,图像和标题的各种参数。

任何想法我们如何能实现这一目标?

你不能为iOS,UIActivityViewController等内置项目,如邮件,脸书和推特改变任何东西。 为了在您的UIActivityViewController中实现项目的自定义操作,您必须为每个需要的自定义活动创build一个UIActivity的自定义子类。 这里是一个例子:

 - (UIActivityViewController *)getActivityViewController { MyFeedbackActivity *feedbackActivity = [[MyFeedbackActivity alloc] init]; MyFacebookActivity *facebookActivity = [[MyFacebookActivity alloc] init]; MyMailActivity *mailActivity = [[MyMailActivity alloc] init]; NSArray *applicationActivities = @[feedbackActivity, facebookActivity, mailActivity]; NSArray *activitiesItems = @[@"A string to be used for MyFeedbackActivity", @"A string to be used for MyFacebookActivity", @"A string to be used for MyMailActivity"]; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activitiesItems applicationActivities:applicationActivities]; // Removed un-needed activities activityVC.excludedActivityTypes = [[NSArray alloc] initWithObjects: UIActivityTypeCopyToPasteboard, UIActivityTypePostToWeibo, UIActivityTypePostToFacebook, UIActivityTypeSaveToCameraRoll, UIActivityTypeCopyToPasteboard, UIActivityTypeMail, UIActivityTypeMessage, UIActivityTypeAssignToContact, nil]; return activityVC; } 

子类UIActivity的一个非常有限的例子,其中包含关于您将感兴趣的方法的文档,以覆盖处理您的自定义数据/操作。

 #import "MyFeedbackActivity.h" @implementation MyFeedbackActivity - (NSString *)activityType { return @"MyFeedbackActivity"; } - (NSString *)activityTitle { return @"Feedback"; } - (UIImage *)activityImage { return [UIImage imageNamed:@"feedback"]; } - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { return YES; } - (UIViewController *)activityViewController { /** * DESCRIPTION: * Returns the view controller to present to the user. * Subclasses that provide additional UI using a view controller can override this method to return that view controller. If this method returns a valid object, the system presents the returned view controller modally instead of calling the performActivity method. * Your custom view controller should provide a view with your custom UI and should handle any user interactions inside those views. Upon completing the activity, do not dismiss the view controller yourself. Instead, call the activityDidFinish: method and let the system dismiss it for you. */ } - (void)prepareWithActivityItems:(NSArray *)activityItems { /** * DESCRIPTION: * Prepares your service to act on the specified data. * The default implementation of this method does nothing. This method is called after the user has selected your service but before your service is asked to perform its action. Subclasses should override this method and use it to store a reference to the data items in the activityItems parameter. In addition, if the implementation of your service requires displaying additional UI to the user, you can use this method to prepare your view controller object and make it available from the activityViewController method. */ } -(void)performActivity { /** * DESCRIPTION: * Performs the service when no custom view controller is provided. * The default implementation of this method does nothing. If your service does not provide any custom UI using the activityViewController method, override this method and use it to perform the activity. Your activity must operate on the data items received in the prepareWithActivityItems: method. * This method is called on your app's main thread. If your app can complete the activity quickly on the main thread, do so and call the activityDidFinish: method when it is done. If performing the activity might take some time, use this method to start the work in the background and then exit without calling activityDidFinish: from this method. Instead, call activityDidFinish: from your background thread after the actual work has been completed. */ } @end