剛纔我有同樣的問題... 大傷腦筋我解決了它後...:d
(如果你不需要解釋,只是看在示例代碼,以及它上面有幾行......:D)
事情是,alertView創建另一個窗口,使其成爲關鍵窗口,並將alertView的視圖放入其中......現在,當您告訴FBConnect重新登錄時,隨着對話和所有,它顯示它是在關鍵窗口內的自我。當時是alertView的窗口。
所以我們只需要讓警報的窗口退出它的關鍵狀態。 我沒有找到一種方法來手動做到這一點,但幸運的是,它爲你做到了這一點。什麼時候?在運行循環結束時(實際上需要一點時間;))。
解決方案非常簡單,讓alert的runloop結束。您可以通過在後臺運行重新登錄方法來完成此操作。
[self performSelectorInBackground:@selector(loginToFaceBook) withObject:nil];
但當時我們有兩個問題需要照顧:
- 正如我前面提到的,它需要它一小會兒,實際清理alertView的混亂(特別是窗口)。所以我們需要等待它。
- FBConnect創建的對話框裏面有一個webView,WebViews不喜歡在後臺...所以我們需要在主線程中調用它。
KennyTM慷慨地提出,這是不可能的檢查其他堆疊警報,我不同意......我用這個代碼:
BOOL shouldWait = YES ;
// wait for the alert view to dissmiss it's self
while (shouldWait) {
[NSThread sleepForTimeInterval:0.1];
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
shouldWait = [keyWindow isKindOfClass:NSClassFromString(@"_UIAlertOverlayWindow")];
}
現在,我不知道這是否是合法的公共API ...但我認爲有各種其他方式來檢查關鍵窗口是否是警報視圖的窗口...另一個想到的是試圖看到它的任何subView的是「 UIAlertView「類...像這樣:
for (UIView *subView in [keyWindow subviews]) {
if (shouldWait = [subView isKindOfClass:[UIAlertView class]) {
break;
}
}
反正,我敢肯定,這是一個可以解決的問題......以後我會提出我的應用程序,如果我會記得(我有記憶問題:/)我會讓你們知道蘋果是否批准了這些工藝中的任何一種......
而你需要的另一件事是在主線程上「顯示」對話框。但是這很容易:
FBStreamDialog* dialog = [[[FBStreamDialog alloc] init] autorelease];
[dialog performSelectorOnMainThread:@selector(show) withObject:nil];
,如果你想與初始化會話的對話框中,你需要做的是在主線程,以及...
我曾呼籲「showDialodWhenAppropriate」的方法我在後臺執行。它會等待,當適當時,我會調用另一個名爲「showTheDialog」的方法,我在主線程中調用它。
Facebook應該可能實現這個自己..但直到他們這樣做,玩得開心。 :D
我dont't明白了,didDismissWithButtonIndex是越來越爲攻的警報按鈕的結果執行。 – 2010-04-26 16:58:08