1

以下は、FBConnectセッションで再試行するために使用しているコードです。[self loginToFaceBook]が起動すると、FBConnectはサブビューを「window」に追加します。これはまだUIAlertビューであるため、UIAlertが実際に閉じると、FBConnectビューが一緒に表示されます。UIAlertビューが消えるのを待つための最良の方法に関するアイデア。

-(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];
}
4

6 に答える 6

3

私は今同じ問題を抱えていました...大きな頭痛の種の後、私はそれを解決しました... :D

(説明が必要ない場合は、サンプルコードとその上の数行を見てください... :D )

問題は、alertView が別のウィンドウを作成し、それをキー ウィンドウにし、alertView のビューをそこに配置することです... FBConnect に再度ログインするように指示すると、ダイアログとすべてが表示され、キー ウィンドウ内に自分自身が表示されます。 . その時点では、alertView のウィンドウです。

そのため、アラートのウィンドウを作成して、それを重要なステータスにする必要があります。私はそれを手動で行う方法を見つけられませんでしたが、幸運にもあなたのためにそれを行います. いつ?実行ループの最後に(実際には少し時間がかかります;))。

解決策は非常に簡単です。アラートの実行ループを終了させます。これを行うには、バックグラウンドで再ログイン メソッドを実行します。

[self performSelectorInBackground:@selector(loginToFaceBook) withObject:nil];

ただし、他に対処すべき 2 つの問題があります。

  • 前に述べたように、alertView の混乱 (特にウィンドウ) を実際にクリーンアップするには、少し時間がかかります。だから私たちはそれを待つ必要があります。
  • FBConnect が作成するダイアログには内部に webView があり、WebView はバックグラウンドにあるのが好きではないため、メイン スレッドでそれを呼び出す必要があります。

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で合法かどうかはわかりません...しかし、キーウィンドウがアラートビューのウィンドウであるかどうかを確認する方法は他にもたくさんあると思います...もう1つ思いつくのは、試してみることですサブビューのいずれかが「UIAlertView」クラスのものであることを確認してください...次のように:

for (UIView *subView in [keyWindow subviews]) {
    if (shouldWait = [subView isKindOfClass:[UIAlertView class]) {
        break;
    }
}

とにかく、それは解決可能な問題だと確信しています...そしてアプリを提出した後、覚えていれば(メモリの問題があります:/)、Appleがこれらの技術のいずれかを承認したかどうかをお知らせします...

もう 1 つは、メイン スレッドでダイアログを「表示」することです。しかし、それは簡単です:

FBStreamDialog* dialog = [[[FBStreamDialog alloc] init] autorelease];
[dialog performSelectorOnMainThread:@selector(show) withObject:nil];

セッションでダイアログを開始したい場合は、メインスレッドでもそれを行う必要があります...

バックグラウンドで実行する「showDialodWhenAppropriate」というメソッドがありました。それは待機を行い、適切なときに、メイン スレッドで呼び出す「showTheDialog」という別のメソッドを呼び出します。

Facebookはおそらくこれを自分で実装する必要があります..しかし、実装するまで楽しんでください. :D

于 2010-07-20T00:28:58.517 に答える
2

ウィンドウがオーダーアウトする時間を確保するために、少し時間間隔を置いてアクションを遅らせることができます。

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

もちろん、他のスタック アラートがないことを確認する必要があります (これらのアラートは、バッテリ低下、プッシュ通知などのシステムから発生する可能性があるため、パブリック API で確認することはできません)。

于 2010-04-26T18:30:06.543 に答える
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];
//  }
}
于 2010-04-26T17:28:02.777 に答える
0

同じ問題ですが、簡単に修正できます。タイマーを使用して、呼び出していた fb メソッドをトリガーしました。ユーザーウォールにメッセージを投稿しようとしていました。didDismissWithButtonIndex: からメソッドをトリガーしていました。

FBDialog の show: メソッドでは、現在のウィンドウを呼び出し、新しいダイアログ ボックスを表示します。FBConnect が使用するダイアログはすべてこれを行うと思います。

タイマーを 0.5 秒に設定してメソッドをトリガーしました。これにより、Alert が適切に閉じられ、FBDialog ボックスが正しいウィンドウで開きます。ボタンインデックスにスイッチケースを使用すると、次のようにうまく機能します。

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

多分それもうまくいくでしょう。

于 2010-08-13T22:58:40.777 に答える
0

もう 1 つのオプションは、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];
于 2012-02-13T15:02:06.480 に答える
-1

電話する必要があります:

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

アラート ビューを閉じます。

于 2010-04-26T16:24:36.610 に答える