#objective-c #ios #cocoa-touch #uiviewcontroller #uikit
#objective-c #iOS #cocoa-touch #uiviewcontroller #uikit
Вопрос:
Справедливо ли говорить, что контроллер, определенный как часть MainWindow.xib, является корневым контроллером приложения?
Кроме того, верно ли предположить, что RootController всегда отвечает за то, какое представление отображается пользователю?
Комментарии:
1. Не всегда. У меня rootviewcontroller иногда устанавливается на NavigationController. И в настройках проекта вы можете указать Xib, который загружается первым при запуске. Но, кроме этого, да, rootviewcontroller может размещать вложенные представления и открывать другие, но navigationcontrollers являются настоящими лидерами при попытке решить, какое представление представить пользователям.
Ответ №1:
Это имеет место в некоторых стандартных проектах на основе окон IB, но, в конечном счете, вам нужно окно и представление, чтобы показать что-то пользователю.
Просто представление:
Подумайте об этом. Я создал пустой проект, добавил представление (просто MyView.xib), добавил кнопку к этому и этому коду. Нет корневых контроллеров — только окно и представление.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
UINib *nib = [UINib nibWithNibName:@"MyView" bundle:nil];
UIView *myView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
[[self window] addSubview:myView];
[self.window makeKeyAndVisible];
return YES;
}
Для типичного окна на основе:
-info.plist указывает на MainWindow.xib (базовое имя основного файла nib), владелец файла указывает на делегата приложения, ViewController делегата приложения указывает на UIViewController . Затем, как правило, для window RootViewController устанавливается значение ViewController, указанное выше.
- (BOOL)application:(UIApplication *)application didFinis hLaunchingWithOptions: (NSDictionary *)launchOptions
{
self.window.rootViewController = self.viewController;
Но, если вы посмотрите на это приложение на основе навигации (проект MasterDetail), там нет MainWindow.xib.
main.m указывает на AppDelegate .
делегат приложения создает главный контроллер в NavigationController, а NavigationController, который был создан программно, становится rootViewContoller
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease];
self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
И, наконец, в этом программном примере windows RootViewController даже не установлен.
Представление контроллера навигации добавляется непосредственно в окно. В конце дня в окне просто размещается представление. Вы можете установить его или корневой контроллер может управлять им.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// create window since nib is not.
CGRect windowBounds = [[UIScreen mainScreen] applicationFrame];
windowBounds.origin.y = 0.0;
[self setWindow:[[UIWindow alloc] initWithFrame:windowBounds]];
// create the rootViewController
_mainViewController = [[MainViewController alloc] init];
// create the navigationController by init with root view controller
_navigationController = [[UINavigationController alloc] initWithRootViewController:_mainViewController];
// in this case, the navigation controller is the main view in the window
[[self window] addSubview:[_navigationController view]];
[self.window makeKeyAndVisible];
return YES;
}