Потеря поддержки вращения после программного добавления UITabBarController в UIWindow - PullRequest
0 голосов
/ 11 июля 2011

Мое приложение запускается только с UIWindow. Я программно добавляю контроллер вида в self.window в application:didFinishLaunchingWithOptions:.

myViewController = [[UIViewController alloc] init:...];
...

[self.window addSubview:myViewController.view];
[self.window makeKeyAndVisible];

В то же время я запускаю фоновый процесс:

[NSThread detachNewThreadSelector:@selector(startupOperations) toTarget:self withObject:nil];

startupOperations выглядит примерно так:

NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init];

// Load data
...

// When your done, call method on the main thread
[self performSelectorOnMainThread:@selector(showMainViewController) withObject:nil waitUntilDone:false];

// Release autorelease pool
[threadPool release];

showMainViewController удаляет myViewController, создает UITabBarController и устанавливает его в качестве основного вида окна:

[self.myViewController.view removeFromSuperview];
self.myViewController = nil;

tabBarController = [[UITabBarController alloc] init];
...

[self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];

Вопросы:

Все контроллеры представления возвращают YES для shouldAutorotateToInterfaceOrientation:. Вращение работает нормально для myViewController, но как только tabBarController становится видимым, вращение перестает работать, и интерфейс появляется в книжной ориентации. В чем причина такого поведения?

Кроме того, в iOS 4.x UIWindow имеет свойство rootViewController. Какова роль этого свойства? Новые шаблоны используют rootViewController вместо [self.window addSubview:...]. Почему это так?

1 Ответ

1 голос
/ 11 июля 2011

Довольно странно.Я попытался смоделировать ваш «поток представления» в простом проекте на основе панели вкладок, и авторотация эффективно работает после удаления исходного контроллера и добавления представления контроллера панели вкладок в качестве подпредставления.

Единственное условие, которое я нашел, где это было сделаноне работает, когда self.window содержит второе подпредставление, которое я не удалил.Не могли бы вы проверить, когда вы выполняете

 [self.window addSubview:tabBarController.view];

что такое self.window.subview контент?

Если это не поможет, не могли бы вы поделиться своим вопросом, как инициализировать UITabBarControllerи UITabBar?

Что касается вашего второго вопроса, как вы говорите, rootViewController является корневым контроллером для всех представлений, принадлежащих окну:

Контроллер корневого представленияобеспечивает представление содержимого окна.Присвоение контроллера представления этому свойству (программно или с помощью Interface Builder) устанавливает представление контроллера представления в качестве представления содержимого окна.Если окно имеет существующую иерархию представлений, старые представления удаляются перед установкой новых.

( Источник )

Вы также можете использовать это, но позаботьтесь о том, чтобы назначить его уже в applicationDidFinishLaunching, в противном случае, если вы вручную добавите подпредставление, а затем измените это свойство, оно не удалит добавленное вами явно подпредставление.

...