У меня очень странная проблема с UINavigationController на iphone, и я бью головой об стену.
Суть в том, что я выполняю вызов на сервер, и когда этот вызов не удается, я заменяю текущее представление на представление, содержащее сообщение об ошибке. Соответствующий код вызывается в основном потоке с помощью executeSelectorOnMainThread
На практике происходит то, что на устройстве он показывает пустой белый экран примерно в два раза меньше. На симуляторе каждый раз появляется пустой экран, заставляющий меня думать, что это, возможно, какая-то проблема синхронизации, которая более заметна из-за лучшей скорости обработки в симуляторе. Это прекрасно работает, если я вызываю ту же функцию, нажимая кнопку в пользовательском интерфейсе для отображения страницы, поэтому я не думаю, что это проблема с самим кодом.
Я убедился, что добавляемый контроллер находится в стеке навигации. Проверено, что он вызывается в главном потоке, он виден, размер и расположение кадра правильные. Я попытался явно установить вид, чтобы быть видимым, переместил его на передний план в родительском виде и вызвал setNeedsDisplay и даже вручную вызвал drawRect. Ничего из этого не работает.
Есть мысли о том, что здесь может происходить? Я предполагаю, что это как-то связано с циклом выполнения, но я не могу понять это. Помощь будет высоко ценится. Относительно простой рассматриваемый код ниже
UINavigationController* navController = self.navigationController;
int count = [navController.viewControllers count];
NSMutableArray* controllers = [[NSMutableArray alloc] initWithCapacity:count];
for (int i=0; i<count; i++) {
if (self == [self.navigationController.viewControllers objectAtIndex:i]) {
[controllers addObject:newController];
}
else {
[controllers addObject:[self.navigationController.viewControllers objectAtIndex:i]];
}
}
[self.navigationController setViewControllers:controllers animated:YES];
[controllers release];