Как программно установить Root View Controller в Objective C?

Я новичок в разработке iOS, пытаясь научиться программно создавать и устанавливать представления.

я пытаюсь сделать быстрый оператор в Obj-C

window?.rootViewController = UINavigationController(rootViewController : ViewController()) 

Проект: Приложение с единым представлением. Попытка связать созданный по умолчанию ViewController.h

Согласно ответу Krunals, я обновил код, но контроллер навигации не отображается в симуляторе.

Cmd+Click на контроллере не переходит к файлу ViewController

#import "AppDelegate.h"
#import "ViewController.h"

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

    self.window.makeKeyAndVisible;




    ViewController *controller = [[ViewController alloc] init];



    window.rootViewController = [[UINavigationController alloc] initWithRootViewController:controller] ;

person ios    schedule 28.08.2017    source источник
comment
Вы имеете в виду два разных окна в своей функции. Локальный window, который вы создаете, и self.window, который является свойством вашего делегата приложения, который, вероятно, равен нулю.   -  person dan    schedule 28.08.2017
comment
@dan я изменил *window на *window2 self.window2.makeKeyAndVisible window2.rootViewController=... Но контроллер навигации по-прежнему не отображается   -  person ios    schedule 28.08.2017


Ответы (4)


Инициализируйте свой контроллер представления ViewController, прежде чем добавлять (использовать в качестве корневого контроллера навигации) в стек контроллера навигации.

Вот пример кода для инициализации простого контроллера представления

UIViewController *controller = [[UIViewController alloc] init];

Вот пример кода для инициализации с использованием раскадровки

ViewController *controller = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"<ViewController - string identifier of your view controller>"];

Вот пример кода для инициализации с использованием NIB/Bundle.

ViewController *controller = [[ViewController alloc] initWithNibName:@"<ViewController - string NIB name>>" bundle:nil];

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

// make sure your NIB name is 'ViewController' 

ViewController *controller = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
if (controller != nil) {
    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController: controller];
    self.window.makeKeyAndVisible;
} else {
   //print - your view controller is nil
}
person Krunal    schedule 28.08.2017
comment
Спасибо за ответ, я новичок, простите меня. если я добавлю UIViewController *ViewController = [[UIViewController alloc] init]; в коде означает ли это, что * ViewController содержит ViewController.m, автоматически сгенерированный проектом Single View? - person ios; 28.08.2017
comment
Я пытаюсь обойтись без раскадровки - person ios; 28.08.2017
comment
Нет, это (первое) не будет работать для вашего кода. Вам нужно определить, какой из них будет работать для вас. Используя раскадровку или NIB (Bundle)? - person Krunal; 28.08.2017
comment
Итак, вы должны инициализировать свой контроллер представления, используя NIB/Bundle. Также убедитесь, что ваше имя NIB — «ViewController». - person Krunal; 28.08.2017
comment
Извините, я не знаком с NIB/Bundle. я пытаюсь сделать быстрый оператор в окне Obj-C?.rootViewController = UINavigationController(rootViewController: ViewController()). Нажатие на ViewController() приводит к ViewController.swift, я пробую ту же функциональность в obj c - person ios; 28.08.2017
comment
Если ваш контроллер представления имеет то же имя, что и его nib, вам не нужно указывать имя nib, вы можете просто сделать [[ViewController alloc] init] - person dan; 28.08.2017
comment
@dan я пробовал, но Ctrl + щелчок не переходит к ViewController.m . Это нормально? Контроллер навигации не отображается на симуляторе - person ios; 28.08.2017

Спасибо Круналу за подробный ответ.

Дэну спасибо за поддержку

я обнаружил проблему вместо self.window.rootViewController, я набрал window.rootViewController.

установка self.window.rootViewController решила проблему.

я не знаю разницы между self.window.rootViewController и window.rootViewController и причины проблемы.

Если кто-то знает ответ, пожалуйста, дайте ответ в комментарии

#import "AppDelegate.h"
#import "ViewController.h"


@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    UIScreen *screen=[[UIScreen alloc]init];
    UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];


    self.window.makeKeyAndVisible;




    ViewController *controller = [[ViewController alloc] init];





    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:controller] ;
person ios    schedule 28.08.2017
comment
Я думаю, что self относится к вашему объекту UIApplication - person Lealo; 15.01.2018

Удалите файл Main.storyboard и оставьте параметр Main interface пустым, прежде чем делать это. введите здесь описание изображения

И добавьте этот код:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
ViewController *vc = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];

ОБНОВЛЕНИЕ. Если вы хотите использовать раскадровку с UINavigationController, попробуйте следующее:

введите здесь описание изображения

person liftlift    schedule 29.08.2017
comment
Что вы имеете в виду удалить основной файл раскадровки? Как это относится к делу? - person n00bProgrammer; 29.08.2017
comment
@ n00bProgrammer Я обновил свой ответ, пожалуйста, проверьте его. - person liftlift; 29.08.2017

Добавление UIViewController и добавление с помощью UINavigationController

      UIStoryboard *storyboard = self.window.rootViewController.storyboard;
           UIViewController *rootViewController= [storyboard instantiateViewControllerWithIdentifier:kIdentifier];
            [self setRootViewController:rootViewController];


        #pragma mark - Set RootView Controller
        -(void)setRootViewController:(UIViewController *)rootViewController {
            self.window.rootViewController = rootViewController;
            [self.window makeKeyAndVisible];
        }


         UIStoryboard *storyboard = self.window.rootViewController.storyboard;
           UIViewController *rootViewController= [storyboard instantiateViewControllerWithIdentifier:kIdentifier];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    [self setRootViewController:navController];

-(void)setRootViewController:(UINavigationController *)rootViewController {
                self.window.rootViewController = rootViewController;
                [self.window makeKeyAndVisible];
            }
person Aakash Panchal    schedule 29.08.2017