У меня была такая же проблема, только сейчас ... После большой головной болью я решил его ...: 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
Я dont't понимаю, didDismissWithButtonIndex становится выполнен в результате нажатия на кнопку тревоги. –