Cocoa touch 为什么这个iPhone程序不调用-loadView?

Cocoa touch 为什么这个iPhone程序不调用-loadView?,cocoa-touch,Cocoa Touch,我正在努力完成基本的iPhone编程,并且我对Interface Builder的工作原理有很好的基本了解,因此我决定尝试以编程方式处理视图。我已经阅读了ViewController Apple指南,搜索了所有地方,但似乎找不到解决问题的方法。这让我相信这是一个非常简单的解决方案,但我只是真的把头撞在墙上。基本上我所要做的就是创建一个视图,将主窗口作为子视图。我知道如果没有定义self.view,那么应该调用loadView方法,并且应该在那里设置所有内容。以下是我的代码的当前状态: 代表: -

我正在努力完成基本的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];
}

提前谢谢你的帮助

我强烈建议您至少在初始窗口/视图中使用interface builder


如果您在XCode中创建一个新项目,您应该能够从所有设置附带的许多预定义iPhone模板中进行选择。

您确定您是从UIViewController继承的,而不是覆盖-UIView*view的实现吗

编辑:更多信息:


UIViewController有一个-UIView*view消息的特殊实现,因此在调用该消息时,如果未设置view成员变量,则调用loadView方法。所以,如果您在子类中提供了-idview的实现,或者提供了一个名为view的属性,它将中断对-loadView的自动调用。

除非我读错了,否则您不会将任何视图与控制器的view属性相关联,如下所示

myViewController.view = controllersView;
因此,就Cocoa而言,您在窗口中设置的视图没有可调用loadView的控制器。loadView是一个视图控制器,而不是视图方法。指定给窗口的视图未与任何视图控制器关联。因此,永远不会调用视图控制器loadView方法。了解了?您试图显示的视图没有与之关联的视图控制器

使用interface builder创建视图时,可以将在IB中创建的UIView对象链接到IB中的控制器中的view属性,该控制器将自动创建框架


但如果未在IB中完成,则必须将其设置为仅记录loadView不称为case:

我编写了2个UITableViewController来处理主ViewController的详细数据。由于devil在2中,我为1制作了一个简单的UITableViewController,并在主ViewController的XIB中引用了它

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

但令我沮丧的是,无论我做了什么,我的简单1 UITableViewController都没有调用viewLoad

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

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

致以最良好的祝愿,
Charles

viewDidLoad仅当视图未从nib归档时,才会在设置视图后调用方法

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

voidloadView{ UIView*视图=[[UIView alloc]initWithFrame:[UIScreen] 主屏幕].applicationFrame]; [查看设置背景颜色:_颜色]; self.view=视图; [查看发布]; }

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


实际上,我已经为我编写的一些初始程序试用了Interface Builder。这段代码实际上是在我尝试创建导航控制器时产生的,我添加了视图,但它不会显示。所以我试着看看是否可以添加到上面的主窗口代码中,不,以编程方式创建窗口、视图和视图控制器没有问题。自己动手可以帮助您理解框架是如何组织的。另外,我发现Xcode模板应用程序中的代码相当复杂。我同意这没有错,但对于SDK新手来说,使用模板是更好的开始方式。这是view controller import@interface StartMenuViewController:UIViewController{UIView*view;}@property nonatomic的标题,保留UIView*视图@你在使用@synthetic view吗?如果你是,那就是问题所在。您不应该声明或实现视图@propertyYou也不应该拥有视图成员,但我不需要
这是相关的。但以后可能会出现问题。实例变量view和名为view的相应属性在UIViewController中声明。再次声明它们,就是在基类中隐藏它们。哇,我知道这一定很简单,尽管我自己永远不会发现这个错误。我已经声明了@synthesis view;。谢谢,谢谢!!