为什么这个iPhone程序没有调用-loadView?

时间:2009-03-12 23:38:24

标签: cocoa-touch

我正在尝试通过基本的iPhone编程工作,并且我对Interface Builder的工作方式有一个很好的基本理解,所以我决定尝试以编程方式执行视图。我已经浏览了ViewController Apple指南并在各处搜索,我似乎无法找到解决问题的方法。这让我相信这是一个非常简单的解决方案,但我只是在撞墙而已。基本上我所要做的就是创建一个视图,将主窗口作为子视图。我知道如果没有定义self.view,那么应该调用loadView方法,并且应该在那里设置所有内容。这是我的代码的当前状态:

代表:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    StartMenuViewController *aViewController = [[StartMenuViewController alloc] init];
    self.myViewController = aViewController;
    [aViewController release];

    UIView *controllersView = [myViewController view];

    window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    [window setBackgroundColor:[UIColor redColor]];

    [window addSubview:controllersView];
    [window makeKeyAndVisible];
}

视图控制器:

- (id)init {
    if (self = [super init]) {
        self.title = @"Start Menu";
    }
    return self;
}

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    UIView *startView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    [startView setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];
    [startView setBackgroundColor:[UIColor greenColor]];
    self.view = startView;
    [startView release];
}

提前感谢您的帮助!

5 个答案:

答案 0 :(得分:9)

你确定你是从UIViewController继承而不是重写 - (UIView *)视图的实现吗?

编辑:更多信息:

UIViewController有一个特殊的“ - (UIView *)视图”消息实现,这样当调用它时,如果未设置视图成员变量,则会调用loadView方法。因此,如果在子类(或名为view的属性)中提供“ - (id)view”的实现,它将中断“ - loadView”的自动调用。

答案 1 :(得分:1)

仅记录“未调用loadView”案例:

我写了一个2 UITableViewController来处理主ViewController的细节数据。由于魔鬼在#2中,我为#1制作了一个简单的UITableViewController,并在XIB中为“主”ViewController引用它。

当我完成#2时,我可以简单地将代码复制到#1,删除复杂的代码,继续生活。

但是令我沮丧和好几天工作,不管我做了什么,viewLoad都没有被我的简单#1 UITableViewController调用。

今天我终于意识到我正在将XIB中的UITableViewController引用到主ViewController程序。 - 当然,从未调用过loadView。

只是为了帮助其他一些犯同样错误的笨蛋......

最诚挚的问候, 查尔斯

答案 2 :(得分:1)

viewDidLoad仅当视图从nib中取消归档时,在设置视图后调用方法。

loadView仅在视图proberty为nil时调用。在以编程方式创建视图时使用。 default:创建一个没有子视图的UIView对象。

  • (void)loadView { UIView * view = [[UIView alloc] initWithFrame:[UIScreen mainScreen] .applicationFrame]; [view setBackgroundColor:_color]; self.view = view; [查看发布]; }

    通过实现loadView方法,您可以挂钩默认的内存管理行为。如果内存不足,视图控制器可能会收到didReceiveMemoryWarning消息。默认实现检查视图是否正在使用中。如果其视图不在视图层次结构中,并且视图控制器实现了loadView方法,则会释放其视图。稍后当需要视图时,将调用loadView方法 再次创建视图。

答案 3 :(得分:0)

我强烈建议您至少在初始窗口/视图中使用界面构建器。

如果您在XCode中创建一个新项目,您应该可以从许多预先定义的iPhone模板中选择一个,这些模板随设置一切。

答案 4 :(得分:0)

除非我读错了,否则您没有将任何视图与控制器的视图属性相关联,如此

myViewController.view = controllersView;

就Cocoa而言,您在窗口中设置的视图没有控制器来调用loadView。 loadView是一个View控件,而不是view方法。分配给窗口的视图不与任何视图控制器关联。因此永远不会调用视图控制器loadView方法。得到它?您尝试显示的视图没有与之关联的视图控制器。

使用界面构建器创建视图时,可以将在IB中创建的UIView对象链接到IB中控制器中的视图属性,框架会自动

但如果没有在IB中完成,你必须设置它