第二个UIWindow不显示(iPad)

时间:2011-04-28 23:58:50

标签: cocoa-touch ios ipad uiwindow

我正在尝试创建两个UIWindows,因为我想在我的应用程序上同时在屏幕上显示两个UINavigationControllers。我在我的app委托中初始化了两个窗口,但只显示了一个窗口的视图。有谁知道为什么会这样?

以下是我使用的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    UIViewController * controller1 = [[UIViewController alloc] init];
    [controller1.view setBackgroundColor:[UIColor grayColor]];
    UINavigationController * nav1 = [[UINavigationController alloc] initWithRootViewController:controller1];
    [window addSubview:nav1.view];
    [window makeKeyAndVisible];

    UIWindow * window2 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    UIViewController * controller2 = [[UIViewController alloc] init];
    [controller2.view setBackgroundColor:[UIColor yellowColor]];
    UINavigationController * nav2 = [[UINavigationController alloc] initWithRootViewController:controller2];
    [window2 addSubview:nav2.view];
    [window2 makeKeyAndVisible];


    NSLog(@"%@", [[UIApplication sharedApplication] windows]);



    return YES;

}

第一个窗口的灰色可见,但第二个窗口的黄色不可见。这个输出是:

"<UIWindow: 0x591e650; frame = (0 0; 768 1024); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x591e7a0>>", "<UIWindow: 0x5923920; frame = (0 0; 100 100); layer = <CALayer: 0x59239a0>>"

表示创建第二个窗口并将其添加到应用程序中,但不显示。有谁知道为什么会这样?

提前致谢!

5 个答案:

答案 0 :(得分:1)

两个UIWindow的windowLevel属性相同,它们都是UIWindowLevelNormal。 如果您想要第一个UIWindow的第二个UIWindow显示字体,您应该将第二个UIWindow的windowLevel值设置得更大。像:

window2.windowLevel = UIWindowLevelNormal + 1;

PS:

[window makeKeyAndVisible];  
...  
[window2 makeKeyAndVisible];

一次只有一个keyWindow,关键窗口是指定用于接收键盘和其他非触摸相关事件的窗口。一次只有一个窗口可能是关键窗口。

答案 1 :(得分:0)

只需使用UISplitViewController

如果您需要自定义,请尝试MGSplitVIewController。它可能有你需要的东西。

答案 2 :(得分:0)

我发现了如何显示第二个UIWindow。您必须将clipsToBound属性设置为YES。否则,来自其中一个窗口的视图将完全覆盖另一个视图。毕竟两个窗口都已正确添加并可见。

答案 3 :(得分:0)

这可能是一个非常古老的帖子,但我遇到了同样的问题。一些已经回答的编码错误,但我们在这里遇到的主要问题是如何实例化UIWindow

这是一个如何正确显示另一个@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? = UIWindow(frame: UIScreen.mainScreen().bounds) let newWindow = UIWindow(frame: UIScreen.mainScreen().bounds) // save a reference to your Window so it won't be released by ARC func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.window!.rootViewController = SomeViewController() self.window!.makeKeyAndVisible() // in your example you have created the window inside this method, // which executes correctly and at the end of this method just releases the window, // because you never saved the reference to the window self.newWindow.rootViewController = SomeOtherViewController() self.newWindow.windowLevel = UIWindowLevelStatusBar + 1.0 self.newWindow.hidden = false return true } } 的Swift示例。

UIWindow

顺便说一下。您无需在AppDelegate中创建autocomplete。这取决于您的代码行为。

答案 4 :(得分:-2)

试试这段代码......

id delegate = [[UIApplication sharedApplication] delegate];
[[delegate FirstView] presentModalViewController:SecondView animated:YES];