iOS 6 - элементы UIActivityViewController [дубликаты]

Надеюсь, все знают, что iOS 6 содержит новый стиль ActionSheet (UIActivityViewController).. UIActivityViewController можно инициировать с такими параметрами, как строка, URL-адрес, изображение и т. д. Ниже приведен фрагмент кода для этого (где элементы представляют собой массив со строкой и параметрами URL-адреса).

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

Но есть ли способ, которым мы можем назначать разные параметры, когда мы выбираем разные варианты обмена, такие как Mail, Facebook или Twitter?

Один из методов заключается в том, что мы можем реализовать UIActivityItemSource, где нам нужно реализовать исходные методы.

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

который всегда возвращает строковое значение. Но мне нужно передать массив, чтобы я мог назначать различные параметры, такие как URL, изображение и заголовок.

Любая идея, как мы можем достичь этого?


person ashok    schedule 20.05.2013    source источник


Ответы (1)


Вы не можете ничего изменить для встроенных элементов iOS UIActivityViewController, таких как Mail, Facebook и Twitter. Чтобы реализовать настраиваемые действия для элементов в вашем UIActivityViewController, вы должны создать настраиваемый подкласс 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
person Jeremy Fox    schedule 20.05.2013
comment
Да, так что, если вы собираетесь проголосовать против ответа, по крайней мере, проявите вежливость, чтобы объяснить, почему. Иначе какой смысл? - person Jeremy Fox; 15.02.2014