Программирование iOS: разъяснения о Root View Controller - PullRequest
9 голосов
/ 30 апреля 2011

В связи с этим вопросом я хотел бы узнать, хорошо ли я понимаю понятие Root View Controller.

В приложении для iOS Root View Controller (RVC) - это контроллер, представление которого добавляется в приложение UIWindow.при запуске, не правда?

[window addSubview:rvcController.View];
[window makeKeyAndVisible];

Теперь, UIWindow также имеет свойство rootViewController.При запуске предыдущего фрагмента кода заполняется ли это свойство с помощью rvcController или я должен установить его явно?

Затем в UINavigationController можно установить RVC, который отличается от предыдущего RVCустановить для точки входа.

В этом случае, когда я впервые добавляю контроллер в стек navigationController (помещая на него новый контроллер), инфраструктура устанавливает этот контроллер в качестве RVC для navigationController или выполняетЯ должен установить это явно через initWithRootViewController метод?

Ответы [ 4 ]

20 голосов
/ 30 апреля 2011

Да .. когда я начал разработку для iPhone ... рутина rootViewController тоже бросила меня в тупик.Но это действительно просто.

когда приложение запускается, я создаю объект UIWindow в своем классе делегата приложения.Кроме того, в этом классе у меня есть свойство типа UIWindow с именем window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    UIWindow *w = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    self.window=w;
    [w release];
    // other code here...
}

Затем я создаю UIViewController, чей view будет первым представлением в иерархии окон, это можно назвать«контроллер корневого представления».

Запутанная часть состоит в том, что ... часто мы создаем UINavigationController как «контроллер корневого представления», и у этого контроллера навигации есть метод init, который запрашивает «RootViewController», который является первым viewcontroller, который он поместит в свой стек.

Итак, окно получает «корневой контроллер представления», то есть UINavigationController, который также имеет RootViewController, который является первым контроллером представленияВы хотите показать.

после того, как вы с этим разберетесь, все это имеет смысл .. Я думаю :-)

вот код, который делает все это .. (взят из проекта, который яесть передо мной)

//called with the app first loads and runs.. does not fire on restarts while that app was in memory
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    


    //create the base window.. an ios thing
    UIWindow *w = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    self.window=w;
    [w release];

    // this is the home page from the user's perspective
    //the UINavController wraps around the MainViewController, or better said, the MainViewController is the root view controller
    MainViewController *vc = [[MainViewController alloc]init];

    UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:vc];
    self.navigationController=nc;  // I have a property on the app delegate that references the root view controller, which is my navigation controller.

    [nc release];
    [vc release];

    //show them
    [self.window addSubview:nc.view];
    [self.window makeKeyAndVisible];

    return YES;
}
8 голосов
/ 30 апреля 2011

Теперь в UIWindow также есть свойство rootViewController. При запуске предыдущего фрагмента кода это свойство заполняется с помощью rvcController, или я должен установить его эксплицит?

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

Затем в UINavigationController можно установить RVC, который отличается от предыдущего RVC, установленного для точки входа.

Конечно, контроллер корневого представления контроллера навигации не имеет ничего общего с окном.

В этом случае, когда я в первый раз добавляю контроллер в стек navigationController (помещая на него новый контроллер), среда устанавливает этот контроллер в качестве RVC для navigationController или мне нужно установить его явность через метод initWithRootViewController

initWithRootViewController - это просто ярлык для инициализации пустого контроллера навигации и помещения первого (корневого) контроллера представления в стек. Обратите внимание, что rootViewController не является свойством UINavigationController, вы можете получить к нему доступ через [navController.viewControllers objectAtIndex:0].

1 голос
/ 29 апреля 2014

во-первых, вы можете создать пустой проект в Xcode.после добавления нового файла на контроллере представления классаjectivec с XIV.теперь вы можете добавить этот код в appdeligate.m и установить rootviewcontroller в appdeligate

ПРИМЕЧАНИЕ: - ViewController.h импортировать в appdeligate.m

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

// Override point for customization after application launch.
   self.window.backgroundColor = [UIColor whiteColor];

   ViewController *viewcontroller =[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];

self.window.rootViewController= viewcontroller;




 [self.window makeKeyAndVisible];
 return YES;

}

0 голосов
/ 29 апреля 2014
 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

// Override point for customization after application launch.
   self.window.backgroundColor = [UIColor whiteColor];

   ViewController *viewcontroller =[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];

self.window.rootViewController= viewcontroller;




 [self.window makeKeyAndVisible];
 return YES;

}

...