2012-09-22 55 views
7

沒有解僱我有一個UIActivity子類,創建自己的activityViewControllerUIActivity activityViewController在iPad上

- (UIViewController *)activityViewController { 
    WSLInProgressViewController* progressView = [[[WSLInProgressViewController alloc] init] autorelease]; 
    progressView.message = [NSString stringWithFormat:NSLocalizedString(@"Posting to %@...",@"Posting to..."), 
         self.activityType]; 

    return progressView; 
} 

我已經加滿repro on GitHub


根據文檔,你不應該手動解僱這個。相反,當您撥打activityDidFinish:時,操作系統會執行此操作。這在iPhone上運行時可以正常工作。

當我說「的作品,」這是我期待的事件序列(看到在iPhone上):

  1. 顯示UIActivityViewController
  2. 用戶按下我的自定義活動
  3. 我的看法控制器出現
  4. 我打電話activityDidFinish:
  5. 我的自定義視圖控制器駁回
  6. UIActivityViewController也駁回

然而,當我運行在iPad上模擬相同的代碼 - 唯一的區別是,我把UIActivityViewController在彈出,因爲文檔說,你應該 - 與activityViewController從未駁回。

正如我所說,這是代碼窩/ popUP在iPhone上工作,我已經步入代碼,所以我知道activityDidFinish:被調用。

我發現這個Radar正在討論same problem in iOS6 beta 3,但它似乎是一個基本的功能,我懷疑我的代碼中有一個錯誤,而不是操作系統(也請注意,它可以正常使用Twitter和Facebook功能!)。


我錯過了什麼嗎?當它在UIPopoverViewController中運行時,我需要在activityViewController中做些特別的事情嗎? 「流量」假設在iPad上會有所不同嗎?

+0

你是如何解僱UIPopoverViewController的?根據過去的經驗,您需要通過調用[myPopoverControler dismissPopoverAnimated]來明確地忽略彈出窗口; –

+0

你有沒有想出這個解決方案?這似乎是一個嚴重的錯誤。基本上這意味着實現'activityViewController'的自定義UIActivity在iPad上是無用的。 – matt

+1

@matt下面接受的答案是我見過的最好的答案。我爲「未解僱」錯誤提出了雷達12545554,併爲「模擬出現」提出了12545600。如果你有機會請欺騙。他們都還是開放的。對於我的應用程序,我最終沒有使用'activityViewController'。 –

回答

0

您是否使用故事板?也許在你的iPad故事板上,UIActivityIndicatorView沒有檢查「隱藏時停止」?

希望它有幫助!

+0

好想法,但沒有。沒有故事板或XIB。 WSLInProgressViewController派生自UIViewController而不是UIActivityIndi​​catorView(我認爲你的意思是UIActivityView?)。 –

+0

啊好吧,太糟糕了:(確實,對不起,我的意思是'UIActivityIndi​​catorView'的確。 – Thermometer

1

我穿過UIActivity另一種觀點則調用下面...

[myActivity activityDidFinish:YES]; 

這工作我的設備上,以及在模擬器。確保你沒有重寫UIActivity .m文件中的activityDidFinish方法,就像我之前做的那樣。你可以看到我使用的代碼here

+0

感謝您的回答,但是,不,我不重寫'activityDidFinish:'。正如我在問題中所說的,相同的代碼工程可以在iPhone(模擬器和設備)上使用,但不能在iPad上使用(模擬器和設備)。 –

+0

奇怪的是,在我們的項目中只複選了兩次,並且它對iPhone和iPad模擬器都正常工作 – AndyDev

+0

我不相信樣品代碼是正確的 - 即使蘋果公司的文檔中沒有提到視圖管理器,它也會駁回視圖控制器 - 它似乎沒有像我期望的那樣工作......菜單在活動解散後不會消失。說,我將擴大這個問題來解釋我認爲應該發生的事情;也許我錯了。 –

-1

最後發佈怎麼樣?使用非弧項目!

[progressView release];

很多用戶都爲u做同樣的問題!另一種解決方案是:

UIActivityIndicatorView *progress= [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)]; 
progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
[alert addSubview:progress]; 
[progress startAnimating]; 

如果您正在使用故事板,請確保當您點擊activityind。點擊「隱藏時停止」!

希望這有助於...

+0

感謝您的回答,但是...'progressView'是autoreleased,因此添加新版本會導致它成爲過度釋放。 'WSLInProgressViewController'不僅僅是一個奇妙的'UIActivityIndi​​catorView',所以它沒有'startAnimating'方法。 –

7

自動解僱只出現在你的「活動」控制器直接呈現,而不是包裹在發生什麼事。因此,在顯示彈出窗口之前,請添加完成處理程序

activity.completionHandler = ^(NSString *activityType, BOOL completed){ 
    [self.popup dismissPopoverAnimated:YES]; 
}; 

而且您會很好。

+0

有趣的是,我會嘗試... –

+1

是的,這是訣竅。 (它仍然以模態形式顯示,而不是彈出窗口,但這是一個不同的問題...) –

+1

這似乎只能延遲問題。第二次選擇自定義活動時,應用程序崩潰。據我所知,第一個UIActivityViewController&UIViewController泄露了,當你嘗試創建第二個UIActivityViewController&UIViewController時,它會崩潰,出現一些陳舊的數據。有沒有人有任何想法如何解決這個問題? – ragfield

1

解決方法是讓調用的ViewController通過- (void)performActivity執行segue到目標ViewController,儘管Apple不建議這樣做。

例如:

- (void)performActivity 
{ 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     [self.delegate performSomething]; // (delegate is the calling VC) 
     [self activityDidFinish: YES]; 
    } 
} 

- (UIViewController *)activityViewController 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
    { 
     UIViewController* vc=XXX; 

     return vc; 
    } 
    else 
    { 
     return nil; 
    } 
} 
2

我有同樣的問題。它解決了我保存activityViewController作爲成員和返回存儲控制器。活動返回新的對象並關閉在新的對象上調用。

- (UIViewController *)activityViewController { 
     if (!self.detaisController) { 
      // create detailsController 
     } 
     return self.detailsController; 
    } 
4

我看問題是很老,但我們已經在這裏調試同一視圖 - 控制器 - 不解散的問題,我希望我的回答會提供一些額外的細節,比調用-dismissPopoverAnimated:一個更好的解決方案手動。

關於UIActivity的文檔相當稀少,雖然它暗示了實現應該被構造的方式,但問題顯示它並不那麼明顯。

您應該注意的第一件事是文檔狀態您應該而不是無論如何手動解僱視圖控制器。這實際上是成立的。

文檔不說什麼,當你遇到調試非dissmissing - 視圖 - 控制器的問題是什麼來作爲可觀察到的東西,是的iOS 打電話給你-activityViewController方法時,它需要的一個參考主題視圖控制器。事實證明,可能只有在iPad上,iOS實際上並未將返回的視圖控制器實例存儲在其結構中的任何位置,然後,當它想要關閉視圖控制器時,它只會要求您的對象提供-activityViewController,然後將其解除。視圖控制器在對方法的第一次調用中實例化(當它被顯示時)從未被解僱。哎喲。這是問題的原因。

我們如何正確解決這個問題?

跳過UIActivity docs進一步可能絆倒-prepareWithActivityItems:方法。特定提示位於沿以下文字:

如果你的服務的實現需要額外的顯示UI給用戶,你可以用這種方法來準備你的視圖控制器對象,並可以從activityViewController方法吧。

所以,這個想法是在-prepareWithActivityItems:方法中實例化您的視圖控制器,並將其解決爲實例變量。然後僅從-activityViewController方法返回相同的實例。

鑑於此,在調用-activityDidFinish:方法而不進行任何進一步手動干預後,視圖控制器將被正確隱藏。

賓果。

注意!深入挖掘這一點,-prepareWithActivityItems:應該而不是每次調用時都會實例化一個新的視圖控制器。如果您之前創建了一個,則應該僅重新使用它。在我們的情況下,如果我們不這樣做,它會愉快地墜毀。

我希望這可以幫助別人。 :)

+0

這是爲我工作。感謝您發佈此解決方案! –

+0

完美的解釋!感謝您花時間在這裏真正找到真正的根源。 – jrwagz

0

所以我有同樣的問題,我有一個自定義UIActivity與自定義activityViewController,當它被模態地呈現它不會不關心,無論我嘗試了什麼。我選擇繼續工作,以便體驗與用戶保持一致,但仍使用自定義UIActivity,但將該活動作爲委託。所以在我的UIActiviy子,我有以下:

- (void)performActivity 
{ 
    if ([self.delegate respondsToSelector:@selector(showViewController)]) { 
     [self.delegate showViewController];  
    } 

    [self activityDidFinish:YES]; 
} 

- (UIViewController *)activityViewController 
{ 
    return nil; 
} 

然後我作出這樣的表示UIActivityViewController委託視圖控制器,它顯示視圖控制器,否則你將顯示activityViewController的委託方法。