Search code examples
iosuiactivityviewcontrolleruiactivity

Lost item after sorting item in menu view


I have problem with UIActivity function.

The first, I create 3 activity items:

  1. activityDownload
  2. activityTrash
  3. activityMove.

And add to UIActivityViewController And then, when I present UIActivityViewController which includes 3 items above. OK, no problem here. Then, when I click button More, and sort items, ex, I move "Move" button to the top, After click "Done" button, I don't know why Download, Trash items was lost? Move items only displays in AirDrop menu view.

NSURL *url = [self fileToURL:self.documentName];
NSArray *objectsToShare = @[url];

AirDropActivityView *activityDownload = [[AirDropActivityView alloc] init];
activityDownload.airDropType = 0;
AirDropActivityView *activityTrash = [[AirDropActivityView alloc] init];
activityTrash.airDropType = 1;
AirDropActivityView *activityMove = [[AirDropActivityView alloc] init];
activityMove.airDropType = 2;

NSArray *uiActivitys = @[activityDownload,activityTrash,activityMove];
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:uiActivitys];

// Exclude all activities except AirDrop.
NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook, UIActivityTypePostToWeibo,UIActivityTypeMessage,UIActivityTypePrint, UIActivityTypeCopyToPasteboard UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll,UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,UIActivityTypePostToVimeo,UIActivityTypePostToTencentWeibo];
controller.excludedActivityTypes = excludedActivities;

// Present the controller
[self presentViewController:controller animated:YES completion:nil];

https://gist.github.com/tranhieutt/f73999234339f31aa86c

Please see screen-shot:

enter image description here

enter image description here


Solution

  • This could be all your Custom UIActivity views you're using that having the same activityType will cause this problem.

    So I recommend to create each more Custom UIActivity for each View you want to use. Like this:

    Create AirDropActivityView1; In AirDropActivityView1.m, implement:

    #import "AirDropActivityView1.h"
    
    @implementation AirDropActivityView
    
    - (NSString *)activityType
    {
        return @"youapp.Activity1";
    }
    
    - (NSString *)activityTitle
    {
        return @"Activity1";
    }
    
    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
    {
        return YES;
    }
    
    @end
    

    And with AirDropActivityView2.m

        #import "AirDropActivityView2.h"
    
        @implementation AirDropActivityView
    
        - (NSString *)activityType
        {
            return @"youapp.Activity2";
        }
    
        - (NSString *)activityTitle
        {
            return @"Activity2";
        }
    
        - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
        {
            return YES;
        }
    
        @end
    

    Finally:

        AirDropActivityView1 *activity1 = [[AirDropActivityView1 alloc] init];
    
        AirDropActivityView2 *activity2 = [[AirDropActivityView2 alloc] init];
    
        NSArray *uiActivitys = @[activity1,activity2];
    

    Now you can reorder them. Hope this help.