2010-04-26 42 views
1

下面是我用來在FBConnect會話上重試的代碼。當[self loginToFaceBook]觸發時,FBConnect將一個子視圖添加到仍然是UIAlert視圖的'window',所以當UIAlert真正解除它時,它會使用FBConnect視圖。任何關於等待UIAlert視圖消失的最佳方式的想法。UIAlertView關閉不真正解僱

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    if([self respondsToSelector:@selector(alertContinue)]) { 
     [self alertContinue]; 
    } 
} 
-(void)alertContinue 
{ 
    SocialLiteAppDelegate *appDelegate = (SocialLiteAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [appDelegate.fbSession logout]; 
    [self loginToFaceBook]; 
} 

回答

-1

你需要調用:

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated 

到解除警報視圖。

+1

我dont't明白了,didDismissWithButtonIndex是越來越爲攻的警報按鈕的結果執行。 – 2010-04-26 16:58:08

0

此代碼僅適用於animated = NO

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if(buttonIndex == alertView.cancelButtonIndex) { 
     exit(0); 
    } 
    [alertView dismissWithClickedButtonIndex:buttonIndex animated:NO]; 
    if([self respondsToSelector:@selector(alertContinue)]) { 
     [self alertContinue]; 
    } 
} 

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
// if([self respondsToSelector:@selector(alertContinue)]) { 
//  [self alertContinue]; 
// } 
} 
2

你可能會延遲一點點時間間隔的作用,讓窗口有時間整理出來:

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    if([self respondsToSelector:@selector(alertContinue)]) { 
     [self performSelector:@selector(alertContinue) withObject:nil afterDelay:0.05]; 
    } 
} 

當然,你需要確保沒有其他堆疊提醒(使用公共API無法檢查,因爲這些警報可能來自系統,例如低電量,推送通知等)。

3

剛纔我有同樣的問題... 大傷腦筋我解決了它後...: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

0

同樣的問題,但容易解決。我用一個計時器來觸發我打電話的fb方法。我正試圖向用戶牆上發佈消息。我正在從didDismissWithButtonIndex觸發該方法:也。

在FBDialog show:方法中,它調用當前窗口並顯示新的對話框。我相信FBConnect使用的任何對話都會這樣做。

我觸發了一個定時器設置爲半秒的方法。它允許警報很好地關閉,然後在正確的窗口中打開FBDialog框。使用按鈕索引的開關盒,我有以下工作很好。

case 1: 
      NSLog(@"Write On Wall"); 
      [self performSelector:@selector(postToWall) withObject:nil afterDelay:0.5f]; 
      break; 

也許這也會起作用。

0

另一種選擇是更改FBDialog.m代碼。更改這段代碼:

UIWindow* window = nil;//[UIApplication sharedApplication].keyWindow; // this does not work if you come from a UIAlertView!!! 
if (!window) { 
    window = [[UIApplication sharedApplication].windows objectAtIndex:0]; 
} 

UIWindow* window = [[UIApplication sharedApplication].windows objectAtIndex:0];