在其委托之外访问时,RootViewController不会添加子视图

时间:2013-07-15 17:49:53

标签: c++ objective-c c cocoa-touch cocoa

我编译的代码没有错误,但我无法显示 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];
}

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

错误是window在标题中声明为static,因此每个翻译单元都有自己独特的window

你已经在AppDelegate.mm中设置了window变量,但是在view.mm中你有一个不同的window仍然是零。如果您要共享window,则应在标头中声明extern,然后在AppDelegate.mm中定义它。

此外,您应该让视图控制器通过继承UIViewController并覆盖loadView来设置自己的视图层次结构。