У меня была такая же проблема только что... После большой головной боли я решил ее...: 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... но я думаю, что есть множество других способов проверить, является ли ключевое окно окном просмотра предупреждений... еще один, который приходит на ум, - это попробовать и посмотрите, что любой из его subView относится к классу "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
person
Alex Zak
schedule
20.07.2010