gpt4 book ai didi

iphone - 使用 initWithNibName : bundle: or via an IBOutlet behave differently 创建的 UIViewController

转载 作者:行者123 更新时间:2023-12-03 19:47:24 27 4
gpt4 key购买 nike

我发现了一个奇怪的行为,并希望得到解释我所做的哪些断言是错误的。

在新创建的 WindowBased 项目的 AppDelegate 类中,我向窗口添加 UIViewController。
我可以通过两种不同的方式来做到这一点:
- 带有 IBOutlet。在 IB 中,我只是实例化了一个 UIViewController,将其类设置为 TestViewController 并连接它(代码的场景 A)。
- 使用代码创建 UIViewController(场景 B)。

    - (void)applicationDidFinishLaunching:(UIApplication *)application {    

#define USE_IBOUTLET YES // Comment this line to switch to scenario B

#ifdef USE_IBOUTLET
// Scenario A

[window addSubview:theTestViewController.view];
[window makeKeyAndVisible];
#endif


#ifndef USE_IBOUTLET
// Scenario B

TestViewController *theTestViewControllerProgrammatically;

theTestViewControllerProgrammatically = [[TestViewController alloc] initWithNibName:nil bundle:nil];

// According to Apple: "It is a good idea to set the view's frame before adding it to a window.", so let's do it
[theTestViewControllerProgrammatically.view setFrame:[[UIScreen mainScreen] applicationFrame]];

[window addSubview:theTestViewControllerProgrammatically.view];

[window makeKeyAndVisible];
#endif
}

由于我没有在 IB 中对对象进行任何自定义,因此在两种情况下我应该具有相同的行为。

场景 A,使用 IBOutlet 按预期工作。
但场景B存在以下问题:
- View 位置不正确(20 像素高,并被状态栏覆盖)。
- View 无法正确调整大小(例如,尝试切换通话中状态栏)

为什么?

如果您想重现问题,请在此处查看项目的 Zip 存档:http://dl.dropbox.com/u/1899122/code/ProtoWindowBasedStrangeness.zip

最佳答案

在我冗长的回答之后,这听起来真的很愚蠢,但是您遇到的问题很容易解决(以编程方式)。

这一行:

[theTestViewController.view setFrame:[[UIScreen mainScreen] applicationFrame]];

实际上应该是:

[theTestViewControllerProgrammaticaly setFrame:[[UIScreen mainScreen] applicationFrame]];

您正在为 IB 设置的 VC 设置框架,而不是您以编程方式创建的框架。

无论如何 - 值得注意的是,我的所有评论仍然适用!如果您不使用 IB 的 Controller 对象,则仍然需要以编程方式执行一些操作(例如,设置导航栏项目)

保罗

关于iphone - 使用 initWithNibName : bundle: or via an IBOutlet behave differently 创建的 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2257124/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com