2014-09-11 98 views
4

如何指定自定義UIActivity支持主題?自定義UIActivity主題

UIActivityItemSource協議的文件中提到,可以實現可選activityViewController:subjectForActivityType:選擇,如果你想你的源提供一個主題:

當發佈一個項目的服務可以提供一個獨立的學科領域,數據字段,例如電子郵件消息。如果您希望爲支持其中的服務提供主題字段,請實施此方法。

但是,據我所知,它沒有記錄在任何地方,我可能實際上指定我的自定義UIActivity支持主題。這是如何完成的?

編輯:爲了使我的問題更加清晰

假設我有一個自定義活動項目源,說DocumentActivityItemSource它實現了UIActivityItemSource協議,我有一個自定義UIActivity,我們可以稱之爲SendWithFooMessageActivity

我然後開始UIActivtyViewController:

NSArray *activityItems = @[[[DocumentActivityItemSource alloc] initWithDocument: document]]; 
NSArray *applicationActivities = @[[[SendWithFooMessageActivity alloc] init]]; 
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems 
                        applicationActivities:applicationActivities]; 
[parentViewController presentViewController:activityViewController 
            animated:YES 
           completion:nil]; 

現在,在彈出的我選擇SendWithFooMessageActivity。然後,活動控制器將在DocumentActivityItemSource實例上調用activityViewController:itemForActivityType:以獲取項目,然後通過調用該對象prepareWithActivityItems:方法將其轉發到SendWithFooMessageActivity

通常情況下,活動項目將是圖像,字符串或網址。在這種情況下,我們假設DocumentActivityItemSource返回一個字符串,其中包含關於文檔的退出Blurb。 SendWithFooMessageActivity然後可以使用這個文本作爲它的foo-mail消息的正文。

但是,Foo消息也要求主題有效。有趣的是,UIActivityItemSource協議還包含可選的activityViewController:subjectForActivityType:,事實上它被記錄爲提供支持服務的主題。

對於Apple提供的電子郵件活動,實際上會發生 - activityViewController:subjectForActivityType:DocumentActivityItemSource上被調用,並且結果在電子郵件中用作主題。

但是,似乎沒有辦法指定我的自定義SendWithFooMessageActivity也想從活動項目中獲得主題?文檔提到這發生在「支持[主題]的服務」 - 那麼我如何指定我的服務確實支持其中一個。

此外,activityViewController:thumbnailImageForActivityType:suggestedSize:也是如此,它應該爲「支持一個的服務」提供縮略圖。這適用於默認的ShareOnTwitter和ShareOnFacebook活動,但似乎沒有辦法讓自定義活動支持它。這可能嗎?

到目前爲止,我已經使用了@chriszumberge下方還提供瞭解決辦法,這是短路activityViewController並直接初始化它來自的ItemSource需要的信息的自定義活動:

[SendWithFooMessageActivity alloc] initWithSubject: document.title]; 

但這似乎不是整個UIActivityViewController設置應該使用的方式。

回答

0

我不認爲有這樣做的自動化方式。

相反,您只需手動調用源項目上的協議方法即可獲得主題。您可以在activityViewController代碼或-(void)performActivity方法上執行此操作。

爲安全起見,你可以檢查,如果它是第一個實現:

NSString *subject = nil; 
if ([item respondsToSelector:@selector(activityViewController:subjectForActivityType:)] 
{ 
    subject = [item activityViewController:activityViewController subjectForActivityType:activityType]; 
} 
+1

你是如何實施協議的?我認爲UIActivity通常不會訪問原始的UIActivityItemSource。據我瞭解,UIActivityItemSource應該從activityViewController:itemForActivityType返回一個項目,並且該項目應該是NSString,UIImage,UIImage或其他項目,具體取決於您想要共享的項目。 您確定只需將UIActivityItemSource作爲一個項目返回?你能得到這個工作的默認蘋果提供的郵件,Twitter和Facebook的活動? – AHM 2014-09-29 10:58:23

1

我會建議:,

UIActivityViewController *activityVC = [[UIActivityViewController alloc] 
    initWithActivityItems:@[@"Info you're emailing out."] applicationActivities:nil]; 
[activityVC setValue:@"Custom Email Subject Here" forKey:@"subject"]; 

但是,由於您使用的是自定義的UIActivity,似乎可以用電子郵件,我假設您使用MFMailComposeViewController發送電子郵件。

在這種情況下,我會創造在自定義UIActivityItemProvider爲主題字符串的屬性,並將其設置在以往的方法您初始化您的自定義UIActivity,並把它傳遞給UIActivityViewController。在供應商可以創建一個字典,並設置主題字符串您在

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

方法所希望的任何鍵值。

從那裏開始,在您的自定義UIActivity中,您可以將您的主題作爲- (UIViewController*) activityViewController方法字典中的屬性進行存儲,並使用以下代碼初始化電子郵件並設置主題。

MFMailComposeViewController *mailCVC = [[MFMailComposeViewController alloc] init]; 
mailCVC.mailComposeDelegate = self; 
[mailCVC setSubject:theSubject]; 
[mailCVC setMessageBody:theMessage isHTML:NO]; 
[mailCVC addAttachmentData:theData mimeType:@"text/csv" fileName:theFileName]; 

EDIT

UIActivityItemProvder協議定義用於由UIActivityViewController對象來檢索數據項作用於方法(直接從蘋果文檔)。 activityViewController:subjectForActivityType:方法是UIActivityItemSource協議的一部分。

默認情況下,您的自定義UIActivityItemProvider符合UIActivityItemSource協議。這就是您需要實施subjectForActivityType:方法的地方。

然後,您可以使用switch/case語句或一羣if語句來確定傳入的[activityType isEqualToString:@"Custom UIActivity Title"]是否在自定義UIActivity的activityTitle方法中定義。 如果是這樣,然後返回任何主題字符串應該是。 但是這需要在您的自定義UIActivityItemProvider子類中。

+0

這也正是我一直在做的,但它看起來像一個kludge,因爲協議似乎包括對主題和縮略圖的支持。我很困惑爲什麼自定義UIA不可能獲得這些 - 看起來像是蘋果的缺陷或疏忽。 – AHM 2014-09-30 06:17:03

+0

@ AHM-我可能誤解了你的陳述,但是它不可能讓自定義UIActivity使用'activityViewController:subjectForActivityType:'選擇器,**除非你讓你的定製UIActivity符合[UIActivityItemSource協議](https ://developer.apple.com/library/ios/documentation/uikit/reference/UIActivityItemSource_protocol/index.html)。 – chriszumberge 2014-09-30 12:21:34

+0

也許我誤解了一些東西。 'UIActivity'會實現'UIActivityItemSource'嗎?據我瞭解,你的自定義UIActivities應該從UIActivity基礎繼承,你的活動項目應該實現UIActivityItemSource協議。然後,您將在UIActivityViewController上註冊這兩個項目和自定義活動,然後會要求用戶選擇一個活動,並使用提供的項目配置所選項目。我所問的是如何指定我的自定義'UIActivity'想要配置一個主題。 – AHM 2014-10-01 09:53:35