RootViewController не добавит подпредставление при доступе вне его делегата

У меня этот код скомпилирован без ошибок, но я не могу сделать welcomeUIView быть отображенным.

Да, когда я перемещаю это внутрь didFinishLaunchingWithOptions это появится Но почему я не могу сделать так, как я хочу?

Вот консоль:

didFinishLaunchingWithOptions
view()
finished

Код:

AppDelegate.h

#import <UIKit/UIKit.h>
static UIWindow *window;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end

AppDelegate.mm

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
std::cout<<"didFinishLaunchingWithOptions"<<std::endl;
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
window.rootViewController = [[UIViewController alloc] init];

view *v = new view();
v->set();

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

std::cout<<"finished"<<std::endl;

return YES;
}

view.mm

#include "view.h"#include "AppDelegate.h"#include <UIKit/UIKit.h>
#include <iostream>

void view::set()
{
std::cout<<"view()"<<std::endl;

UIView *welcomeUIView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[welcomeUIView setBackgroundColor:[UIColor darkGrayColor]];

[welcomeUIView setHidden:false];
[window.rootViewController.view addSubview:welcomeUIView];
[window.rootViewController.view bringSubviewToFront:welcomeUIView];
}

0

Решение

Ошибка в том, что window объявлен как static в вашем заголовке, так что каждый блок перевода будет иметь свой собственный window,

Вы установили window переменная в AppDelegate.mm, но тогда в view.mm у вас есть другой window который все еще ноль. Если вы хотели поделиться window Вы должны объявить это extern в вашем заголовке, а затем определите его в AppDelegate.mm.

Кроме того, вы должны просто позволить вашему контроллеру представления установить свою собственную иерархию представления, создав подкласс UIViewController и переопределив loadView,

0

Другие решения

Вы можете легко добавить представление в свой корневой контроллер представления. Сделай это в viewDidLoad

-(void)viewDidLoad {
[super viewDidLoad];

UIView *welcomeView =
[[UIView alloc] initWithFrame:self.view.bounds];
welcomeView.backgroundColor = UIColor.darkGrayColor;
[self.view addSubview:welcomeView];
}

Это, однако, не охватит весь экран, если у вас есть строка состояния или панель навигации. Вместо этого вы можете добавить представление к self.view.window (с CGRect из вашего кода).

0