【问题标题】:Why is this iPhone program not calling -loadView?为什么这个 iPhone 程序不调用 -loadView?
【发布时间】:2010-10-13 01:23:38
【问题描述】:

我正在尝试通过基本的 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];
}

提前感谢您的帮助!

【问题讨论】:

    标签: cocoa-touch


    【解决方案1】:

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

    编辑:更多信息:

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

    【讨论】:

    • 这是视图控制器的标题 #import @interface StartMenuViewController : UIViewController { UIView *view; @property (nonatomic,retain) UIView *view; @end
    • 你在使用@synthesize 视图吗?如果你是,那就是问题所在。您不必声明或实现视图@property
    • (你也不应该有视图成员,但我认为这不相关。不过它可能会在以后引起问题。)
    • UIViewController中声明了实例变量view和对应的名为view的属性。通过再次声明它们,您将它们隐藏在基类中。
    • 哇,我知道它一定是这么简单,尽管我自己永远不会发现这个错误。我已经声明了@synthesize 视图;。谢谢,谢谢!
    【解决方案2】:

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

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

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

    但令我沮丧和几天的工作,无论我做什么,都没有为我的简单 #1 UITableViewController 调用 viewLoad。

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

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

    最好的问候, 查尔斯

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 实际上我已经尝试过 Interface Builder,用于我编写的一些初始程序。这段代码实际上是在我尝试创建导航控制器时产生的,我添加了视图但它不会显示出来。所以我试着看看我是否可以添加到主窗口(上面的代码),没有骰子
        • 以编程方式创建窗口、视图和视图控制器没有任何问题。自己动手可以帮助您了解框架的组织方式。另外,我发现 Xcode 模板应用程序中的代码相当复杂。
        • 我同意这并没有错,但对于 SDK 新手来说,使用模板是更好的开始方式。
        【解决方案5】:

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

        myViewController.view = controllersView;
        

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

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

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

        【讨论】:

          猜你喜欢
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 2013-01-26
          • 2016-04-20
          • 2013-02-13
          • 2015-05-21
          • 2015-11-14
          • 1970-01-01
          相关资源
          最近更新 更多