Ustawianie różnych pozycji aktywności dla interfejsu UIActivityViewController Swift

Mam UIActivityViewController z 4 opcjami: wiadomość / Poczta / TW / FB. Chcę wysłać różne działania dla każdej opcji!

Dla eg: W iMessage arkuszu, muszę umieścić : String, NSURL, i UIImage. W mailu muszę umieścić string w polu Subject, następnie String W body, UIImage i NSURL również. W {[7] } chcę umieścić obrazek tak jak zrobił to post socials, również jakiś String i NSURL.

Czy masz pojęcie, czy jest to możliwe w iOS8, z Swift ?

Szukałem wiele dla niektórych kawałków kodu, nie znalazł dla mnie najlepszego.

Author: David 'mArm' Ansermot, 2015-05-05

3 answers

Powinieneś skorzystać z protokołu UIActivityItemSource. Parametr activityItems inicjalizatora UIActivityViewController akceptuje tablicę obiektów danych lub tablicę obiektów implementujących protokół UIActivityItemSource.

Jako przykład rozważ źródło elementu, jak poniżej.

class MyStringItemSource: NSObject, UIActivityItemSource {
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        return ""
    }

    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
        if activityType == UIActivityTypeMessage {
            return "String for message"
        } else if activityType == UIActivityTypeMail {
            return "String for mail"
        } else if activityType == UIActivityTypePostToTwitter {
            return "String for twitter"
        } else if activityType == UIActivityTypePostToFacebook {
            return "String for facebook"
        }
        return nil
    }

    func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String {
        if activityType == UIActivityTypeMessage {
            return "Subject for message"
        } else if activityType == UIActivityTypeMail {
            return "Subject for mail"
        } else if activityType == UIActivityTypePostToTwitter {
            return "Subject for twitter"
        } else if activityType == UIActivityTypePostToFacebook {
            return "Subject for facebook"
        }
        return ""
    }

    func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String!, suggestedSize size: CGSize) -> UIImage! {
        if activityType == UIActivityTypeMessage {
            return UIImage(named: "thumbnail-for-message")
        } else if activityType == UIActivityTypeMail {
            return UIImage(named: "thumbnail-for-mail")
        } else if activityType == UIActivityTypePostToTwitter {
            return UIImage(named: "thumbnail-for-twitter")
        } else if activityType == UIActivityTypePostToFacebook {
            return UIImage(named: "thumbnail-for-facebook")
        }
        return UIImage(named: "some-default-thumbnail")
    }
}

Powyższy element source zwraca różne obiekty, tematy i obrazy miniatur w zależności od typu aktywności. Aby użyć, wystarczy przekazać go do UIActivityViewController inicjalizator.

UIActivityViewController(activityItems: [MyStringItemSource()], applicationActivities: nil)

Podobnie można zdefiniować klasę MyUrlItemSource, która zwraca różne adresy URL w zależności od wybranej aktywności i przekazuje ją w inicjalizatorze.

UIActivityViewController(activityItems: [MyStringItemSource(), MyUrlItemSource()], applicationActivities: nil)

Wszystko to jest opisane w oficjalnej dokumentacji dla UIActivityViewController oraz UIActivityItemSource

 53
Author: hennes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-12 19:15:35

To samo rozwiązanie jak z hennes przetłumaczone na swift 3

class MyStringItemSource: NSObject, UIActivityItemSource {

  public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
    return ""
  }

  public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
    if activityType == UIActivityType.message {
      return "String for message"
    } else if activityType == UIActivityType.mail {
      return "String for mail"
    } else if activityType == UIActivityType.postToTwitter {
      return "String for twitter"
    } else if activityType == UIActivityType.postToFacebook {
      return "String for facebook"
    }
    return nil
  }

  public func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivityType?) -> String {
    if activityType == UIActivityType.message {
      return "Subject for message"
    } else if activityType == UIActivityType.mail {
      return "Subject for mail"
    } else if activityType == UIActivityType.postToTwitter {
      return "Subject for twitter"
    } else if activityType == UIActivityType.postToFacebook {
      return "Subject for facebook"
    }
    return ""
  }

  public func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivityType?, suggestedSize size: CGSize) -> UIImage? {
    if activityType == UIActivityType.message {
      return UIImage(named: "thumbnail-for-message")
    } else if activityType == UIActivityType.mail {
      return UIImage(named: "thumbnail-for-mail")
    } else if activityType == UIActivityType.postToTwitter {
      return UIImage(named: "thumbnail-for-twitter")
    } else if activityType == UIActivityType.postToFacebook {
      return UIImage(named: "thumbnail-for-facebook")
    }
    return UIImage(named: "some-default-thumbnail")
  }

}
 4
Author: Mihuilk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 09:54:52

Objective-C odpowiednik hennes odpowiedź:

@interface MyStringItemSource : NSObject <UIActivityItemSource>
{

}

@end


@implementation MyStringItemSource

-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
    return @"";
}

-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType
{
    if (activityType == UIActivityTypeMessage) {
        return @"String for message";
    } else if (activityType == UIActivityTypeMail) {
        return @"String for mail";
    }
    return nil;
}

-(NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(UIActivityType)activityType
{
    if (activityType == UIActivityTypeMessage) {
        return @"Subject for message";
    } else if (activityType == UIActivityTypeMail) {
        return @"Subject for mail";
    }
    return @"";
}

-(UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(UIActivityType)activityType suggestedSize:(CGSize)size
{
    if (activityType == UIActivityTypeMessage) {
        return [UIImage imageNamed: @"thumbnail-for-message"];
    } else if (activityType == UIActivityTypeMail) {
        return [UIImage imageNamed: @"thumbnail-for-mail"];
    }
    return [UIImage imageNamed: @"thumbnail-for-default"];
}

@end
 2
Author: Neimsz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-19 09:03:28