Home > Back-end >  How to UIActivityViewController excluded items dynamic based on a changing array?
How to UIActivityViewController excluded items dynamic based on a changing array?

Time:04-12

I went through a tutorial for implementing the UIActivityViewController everything is working as expected. I can also use excludedItems property to remove any default options in UIActivityViewController. But now I want to make this code more dynamic. Actually my plan is that user can choose which options he can choose to omit or exclude from the UIActivityViewController . So for that I am planning to pass an array with some fixed keys and based on that keys I can define which items to included in excluded lists. Below is the sample code :

NSArray* excludedArray = [NSArray arrayWithObjects: @"Facebook", nil];
UIActivityViewController *controller = [[UIActivityViewController alloc]initWithActivityItems:items applicationActivities:nil];
if ( [excludedArray containsObject: @"Facebook"] ) {
    NSArray *excluded = @[UIActivityTypeMessage];
    controller.excludedActivityTypes = excluded;
}

Right now excludedArray only contains message string so based on that I added the UIActivityTypeMessage to excluded array . But tomorrow if the user adds more item to excludedArray for example print then based on that I must be able to add UIActivityTypePrint to excluded array. How to achieve that?

CodePudding user response:

  • Link UIActivityType enum values with the selection you'll give to user using switch case.

  • On select/deselect update the array.

  • At last pass the enum array to excludedActivityTypes.

      func getExcludedActivityTypes(stringArray: [String]) -> [UIActivity.ActivityType]{
      var excludeArray: [UIActivity.ActivityType] = []
      for str in stringArray
      {
          switch str
          { 
          case "messaging":
              excludeArray.append(.message)
              break
          case "postToTwitter":
              excludeArray.append(.postToTwitter)
              break
    
              // write others to exclude those types
          default:
              break
          }
      }
    
      return excludeArray}
    

Objective c - Alternative(you can use if else statement as objective c doesn't support strings for switch cases)

-(NSArray<UIActivityType>*)getExcludedActivityTypes:(NSArray<NSString*>*)stringArray {
NSMutableArray<UIActivityType> * excludeArray = @[].mutableCopy;

for(NSString * str in stringArray) {
    if([str isEqualToString:@"messaging"]){
        [excludeArray addObject:UIActivityTypeMessage];
    }
    
    else if([str isEqualToString:@"postToTwitter"]){
        [excludeArray addObject:UIActivityTypePostToTwitter];
    }
    // write others to exclude those types
}
return excludeArray;}
  • Related