4

在 AppDelegate 中,我想创建一个 UIViewController 子类并添加它的视图。viw 本身将在代码中指定 - 没有笔尖。

基于苹果文档,我应该使用

initWithNibName:nil bundle:nil];

然后在控制器的 loadView 中,添加我的子视图等。

但是,下面的测试代码对我不起作用。我在 Apple 的PageControl demo上对 AppDelegate 代码进行了建模,仅仅是因为我的应用程序将实现类似的结构(特别是用于管理分页滚动视图的基本控制器,以及用于构建页面的其他控制器的数组)。

但我怀疑我的 AppDelegate 代码是问题所在,因为日志记录证明 initWithNibName:: 和 loadView 都会触发。下面的应用程序运行,但屏幕是空白的。我期待一个带有标签的绿色视图。

应用委托

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        ScrollerController *controller = [[ScrollerController alloc] initWithNibName:nil bundle:nil];
        [self.window addSubview:controller.view];
        [self.window makeKeyAndVisible];
        return YES;
    }

ScrollerController(UIViewController 子类)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)loadView{
    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
    UIView *contentView = [[UIView alloc] initWithFrame:applicationFrame];
    contentView.backgroundColor = [UIColor greenColor];
    self.view = contentView;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 100, 40)];
    [label setText:@"Label created in ScrollerController.loadView"];
    [self.view addSubview:label];
}
4

2 回答 2

5

尝试使用: self.window.rootViewController = controller; 而不是 [self.window addSubview:controller.view];

请注意,您还应该@synthesize window;创建它 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

于 2012-05-30T20:20:49.947 回答
4

而不是 initWithNibNamed:,只需使用 alloc 和 init 或任何其他为视图控制器指定的初始化程序。这是一个项目的例子

hoverViewController=[[BDHoverViewController alloc] initWithHoverStatusStyle:BDHoverViewStatusActivityProgressStyle];
self.window.rootViewController=hoverViewController;
[self.window makeKeyAndVisible];

此外,在应用程序委托中将根视图控制器添加到窗口的正确形式(现在无论如何)是这样的:

self.window.rootViewcontroller=controller;
[self.window makeKeyAndVisible];

您不需要将视图添加到窗口。上面的代码会自动完成。

祝你好运,

于 2012-05-30T20:23:29.007 回答