我发现一个奇怪的行为,并希望能解释什么样的断言我做的那是错误的。

在一个如类的一个新创建的WindowBased项目,我增加一个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下问题:
-看是不是在正确的位置(20素到高,而复盖的状态条)。
-看不适当调整(例如,试图切换呼叫状态条)

为什么?

Zip archive的项目,在这里,如果你希望的重现的问题: http://dl.dropbox.com/u/1899122/code/ProtoWindowBasedStrangeness.zip

有帮助吗?

解决方案

这听起来真的愚蠢之后我的长篇大论的答案,但是问题你有的是简单的解决(通过程序).

这一行:

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

实际上应该是:

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

你设置的框架VC设IB,不通过一个你创建的通过程序.

无论如何-这是值得注意的是,我所有的评论仍然适用!还是有几件事你必须要做的编程方式如果你不使用IB的控制对象(例如,设置导航条项目)

保罗

其他提示

我在这已经有一个非常类似的问题给你,我注意到VC对象不是所有的平等!我在被设置导航栏项目的问题,我似乎无法做到这一点时,文件的所有者是我编程实例化视图控制器对象。它只有当我解除存档IB的控制器对象的工作。

我下载了你的项目,并与它周围有一出戏,这让我思考一些更多地了解可能什么。我想我可以提供一个合理的答案,但不知道如果有一个简单的解决方案...

我相信这是怎么回事的是,苹果已经创建了IB一些稍微更专业的这些控制器对象。一个建议,这可能是真实的是,IB VC对象有一个属性,你可以设置有一个UIViewController类,我可以看到没有直接对应的属性,因此IB的控制器对象可能有一些额外的功能,非IB的UIViewController子类可以不利用。鉴于在的.xib对象是完整的“冻干”对象,苹果可能已经包括各类私人属性,我们无法看到或在他们的IB版本使用 - 这可能对对象是如何初始化一些效果

例如,在你的MainWindow.xib,选择IB VC对象,你可以设置从Inspector面板于它的属性,如“调整视图从NIB”。如果您未检查并重新运行你的应用程序,你会看到VC出现,正是因为它在场景选B.当从文件的所有者属性,你可以不会检查该项目(即使它是作为一个UIViewController ),你无法利用无论是由视图控制器做给你你想要的行为。

这样做的结果是,当你使用TestViewController.xib初始化代码的VC对象,没有一个VC的IB特定属性的设置,因此一个沼泽标准的UIViewController被创建,等等之类的东西“重新查看从NIB”属性和设置导航项目必须实施自己。

我还没有找到一种方法来利用这一点,当我实例使用它们IB initWithNibName:bundle:nibBundle的视图控制器具有的功能(我猜这是我们无法访问所有私人的东西),但希望这有可能给你一个起点......

当然,我可能是完全错误的,会有人让我看起来像个十足的傻瓜!

大概在情况B该视图是不知道的状态条的存在。您需要相应地调整其大小并调整其位置采取状态栏进去。这是通过改变一个UIView的帧(大小)和边界(位置)属性来完成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top