2012-11-17 47 views
13

在iOS 6中使用客戶UIActivity子類時,可以指定一個自定義視圖控制器,當您從初始UIActionViewController的視圖中選擇動作時將顯示該控制器。您可以通過從UIActivity子類的activityViewController方法中返回對自定義視圖控制器的引用來完成此操作。UIActivity activityViewController在iPad上而不是在彈出窗口中呈現

按照UIActivity class reference

activityViewController

此方法的默認實現返回nil。使用視圖控制器提供其他UI的子類可以重寫此方法以返回該視圖控制器。如果此方法返回有效對象,則系統會爲您呈現返回的視圖控制器,而不是調用performActivity方法。在iPad上,您的視圖控制器顯示在彈出窗口中。在iPhone和iPod touch上,您的視圖控制器將以模態方式呈現。

您的自定義視圖控制器應該爲您的自定義UI提供視圖,並且應該處理這些視圖內的任何用戶交互。完成該活動後,請勿自行解除視圖控制器。相反,請撥打activityDidFinish:方法,讓系統爲您解除它。

需要注意的是位在第一段落的末尾:在iPad上,你的視圖控制器提出了一種酥料餅的內部。在iPhone和iPod touch上,您的視圖控制器將以模態方式呈現。

但是,在iPad上,由activityViewController返回的視圖控制器總是以模態方式顯示,無論我如何呈現UIActivityViewController(無論是通過模式還是通過彈出窗口)。當通過popover展示時,它會導致它崩潰,因爲它不認爲它已被解僱。

我在做什麼錯?這是iOS 6中的錯誤嗎?


更新:這是一個簡單的Xcode項目,說明問題。隨意克隆它和玩,看看你能看到我們要去哪裏錯了:github.com/simonwhitaker/GSActivityDemo

+0

什麼是你的問題? – msgambel

+0

這裏同樣的問題。我修改了原來的帖子以添加一個明確的問題,希望你不介意@Gujamin。 –

+0

太寬泛,以不確定.... :(我可以開始瘋狂的猜測,但我寧願你編輯的問題,也許顯示一些代碼或這樣的! - 哦,你用弧? –

回答

23

正如我們所談論的UIActivityViewController,這是顯示給用戶的可用活動的看法。蘋果聲明以下...

您的應用程序負責配置,呈現和解散此視圖控制器。視圖控制器的配置涉及指定視圖控制器應該在其上操作的數據對象。 (您也可以指定您的應用程序支持的自定義服務列表。)在呈現視圖控制器時,您必須使用適合當前設備的方法來執行此操作。在iPad上,您必須在彈出窗口中顯示視圖控制器。在iPhone和iPod touch上,您必須以模態形式呈現它。

我把最後一行作爲一個標誌,你必須處理如何呈現視圖,所以我檢查代碼是否在iPad上運行並相應地使用UIPopover。正如你可以在這裏... https://github.com/bufferapp/buffer-uiactivity/blob/master/BufferUIActivity/Views/FirstViewController.m以下方法。

-(IBAction)openUIActivityView:(id)sender { 

    NSString *text = @"Hello world"; 
    NSString *url = @"http://bufferapp.com"; 


    NSArray *activityItems = @[text, url]; 

    BufferUIActivity *bufferActivity = [[BufferUIActivity alloc] init]; 

    UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:@[ bufferActivity ]]; 


    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
     [self presentViewController:activityView animated:YES completion:^{ 

     }]; 
    } else { 
     // Change Rect to position Popover 
     self.popup = [[UIPopoverController alloc] initWithContentViewController:activityView]; 
     [self.popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.width/2, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    } 

} 
+0

嗨,Andy,不,那不是我們正在談論的 - 我澄清了這個問題,我們談論的是自定義視圖控制器顯示在用戶選擇一個動作後。給出一個具體的e xample,我將「上傳到Dropbox」操作添加到我的應用程序中。所以有一個自定義的UIActivity子類,它爲活動頁添加了一個Dropbox按鈕。當你點擊那個按鈕時,我顯示一個自定義的VC,允許你爲你的文件選擇目標文件夾。這就是那個應該在iPad上彈出顯示的VC,但總是以模態方式顯示。 –

+0

道歉,這是一個奇怪的,因爲我爲Buffer做的UIActivity也在iPad上模態顯示,但蘋果的Twitter/Facebook工作表也是如此。我傾向於說這是iOS6的問題,或者文檔是錯誤的。 – AndyDev

3

我認爲活動視圖控制器在彈出窗口中未顯示的問題是一個錯誤,文檔反映了正確的意圖。但是,我不知道解決這個atm的方法。

然而,關於解僱視圖控制器的部分是一個不同的問題。你不應該關閉你從-[UIActivity activityViewController]返回的視圖控制器,但是你是負責解除你提供的彈出窗口,這反過來也會從層次結構中刪除你的自定義視圖控制器。 (由於它以這種方式工作,我傾向於認爲,自定義視圖控制器通常必須在酥料餅中顯示。)

下面是your example應用程序與代碼的例子:

UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:activityItems 
                   applicationActivities:applicationActivities]; 

vc.completionHandler = ^(NSString *activityType, BOOL completed){ 
    [self.activityPopoverController dismissPopoverAnimated:YES]; 
}; 
+0

第二個想法,就像AndyDev提到的那樣,除了打印對話框之外,所有其他內置活動也都以模態屏幕顯示。另一個線索是,在呈現自定義視圖控制器之前,它獲取' - [UIViewController setModalTransitionStyle:]'消息,表明它確實有意要模態地呈現它。 – alloy

+0

在視圖控制器問題上的好處不會消失。謝謝! –

+0

我猜可能有一個私人的API調用,蘋果忽略公開,控制是否呈現activityViewController模態或在現有的彈出窗口。 –

-3

我有同樣的問題,而是由視圖控制器設置爲解決它:

[yourViewController setModalPresentationStyle:UIModalPresentationPageSheet]; 

- (UIViewController *)activityViewController 

希望這有助於

+1

問題是它應該在iPad上的彈出窗口中顯示。這不會發生,特別是如果您通過將演示文稿樣式設置爲頁面表來強制執行此操作。 – Gujamin

1


我有同樣的問題在iOS的7,以顯示在酥料餅的自定義視圖是創建並在-(void)performActivity方法表現出來,而不是在-(UIViewController *)activityViewController返回它的解決方案。

你可以看到示例代碼在我的提問/回答這個鏈接下:
iOS 7 custom UIActivity as popover

相關問題