2010-04-26 7 views
1

Ниже приведен код, который я использую для повтора на сеансе FBConnect. Когда [self loginToFaceBook] запускает FBConnect, добавление subview в «окно», которое все еще является представлением UIAlert, поэтому, когда UIAlert действительно отклоняется, он принимает вид FBConnect. Любая идея о том, как наилучшим образом ждать просмотра UIAlert.UIAlertView Dismiss Not Really Dissed

-(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 становится выполнен в результате нажатия на кнопку тревоги. –

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, поскольку эти предупреждения могут поступать из системы, например, с низким уровнем заряда аккумулятора, push-уведомлениями и т. д.).

3

У меня была такая же проблема, только сейчас ... После большой головной болью я решил его ...: D

(если вам не нужны объяснения, просто посмотрите на пример кода, и несколько строк над ним ...: D)

Дело в том, что alertView создает другое окно, делает его ключевым окном и размещает в нем вид alertView ... теперь, когда вы сообщаете FBConnect для входа в систему, с диалогом и всем, он показывает, что он находится внутри ключевого окна. который в то время является окном alertView.

Поэтому нам просто нужно сделать окно предупреждения, чтобы уйти в отставку, это ключевой статус. Я не нашел способ сделать это вручную, но, к счастью, это делает это для вас. когда? в конце цикла выполнения (и на самом деле это занимает немного времени;)).

Решение довольно простое, позвольте оповещению оповестить конец. вы делаете это, запустив метод повторного входа в фоновом режиме.

[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 ... но я думаю, что есть всевозможные другие способы проверить, является ли ключевым окном окно окна предупреждения ... еще один, который приходит на ум, - это попытаться увидеть его, что любой из его подвид выглядит как " UIAlertView "...как так:

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

В любом случае, я уверен, что это решаемая проблема ... и после того, как я буду представлять мое приложение, и если я буду помнить (у меня есть проблемы с памятью: /) я дам вы, ребята, знаете, одобрили ли Apple какую-либо из этих техник ...

, а другая вещь вам понадобится, чтобы «показать» диалог в основной теме. но это легко:

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

, если вы хотите, чтобы инициализировать диалоговое окно с сеанса, вы должны сделать это в главном потоке, а также ...

я метод, называемый «showDialodWhenAppropriate» которые я выполняю в фоновом режиме. он выполняет ожидание, и когда это уместно, я вызываю другой метод под названием «showTheDialog», который я вызываю в основном потоке.

Facebook должен, вероятно, реализовать это сами .. но пока они этого не сделают, получайте удовольствие. : D

0

Такая же проблема, но легко исправить. Я использовал таймер для запуска метода fb, который я вызывал. Я пытался отправить сообщение на стену пользователей. Я также запускал метод из didDismissWithButtonIndex: также.

В режиме FBDialog show: метод вызывает текущее окно и отображает новое диалоговое окно. Я считаю, что любой диалог, используемый FBConnect, делает это.

Я вызвал метод с таймером, установленным на полсекунды. Это позволяет Alert закрываться красиво, а затем окно 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];