У меня этот код скомпилирован без ошибок, но я не могу сделать 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];
}
Ошибка в том, что window
объявлен как static
в вашем заголовке, так что каждый блок перевода будет иметь свой собственный window
,
Вы установили window
переменная в AppDelegate.mm, но тогда в view.mm у вас есть другой window
который все еще ноль. Если вы хотели поделиться window
Вы должны объявить это extern
в вашем заголовке, а затем определите его в AppDelegate.mm.
Кроме того, вы должны просто позволить вашему контроллеру представления установить свою собственную иерархию представления, создав подкласс UIViewController и переопределив loadView
,
Вы можете легко добавить представление в свой корневой контроллер представления. Сделай это в 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 из вашего кода).