Второе UIWindow не отображается (iPad)

#cocoa-touch #ios #ipad #uiwindow

#cocoa-touch #iOS #iPad #uiwindow

Вопрос:

Я пытаюсь создать два UIWindows, потому что я хотел бы, чтобы два UINavigationControllers одновременно отображались на экране в моем приложении. Я инициализирую два окна в делегате моего приложения, но отображается только вид одного окна. Кто-нибудь знает, почему это так?

Вот код, который я использовал:

 - (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>>"

это означает, что второе окно создано и добавлено в приложение, но просто не отображается. Кто-нибудь знает, почему это так?

Заранее спасибо!

Ответ №1:

windowLevel Свойство двух UIWindow равно, они все одинаковы UIWindowLevelNormal . Если вы хотите, чтобы во втором UIWindow отображался шрифт первого UIWindow, вам следует увеличить windowLevel значение второго UIWindow. Нравится:

 window2.windowLevel = UIWindowLevelNormal   1;
  

PS:

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

Одновременно отображается только одно keyWindow окно клавиш, предназначенное для приема клавиатурных и других событий, не связанных с касанием. Ключевым окном может быть только одно окно одновременно.

Ответ №2:

Просто используйте UISplitViewController .

Или попробуйте MGSplitViewController, если вам нужна настройка. Возможно, в нем есть то, что вам нужно.

Комментарии:

1. Второй навигационный контроллер должен иметь пользовательский фрейм, поэтому, к сожалению, это не работает.

2. Спасибо за предложение. Я просмотрел код для MGSplitViewController, и кажется, что только корневой вид имеет навигационный контроллер.

Ответ №3:

Я обнаружил, как заставить второе UIWindow отображаться. Вы должны установить для свойства clipsToBound значение YES. В противном случае вид из одного из окон полностью закроет другой вид. В конце концов, два окна были добавлены правильно и видны.

Комментарии:

1. можете ли вы расширить это? Я сталкиваюсь с той же проблемой. В новом окне отображаются ограничения clipsToBounds?

Ответ №4:

Это может быть действительно старое сообщение, но я просто столкнулся с той же проблемой. На некоторые ошибки кодирования уже даны ответы, но основная проблема, с которой мы сталкиваемся здесь, заключается в том, как вы создаете экземпляр UIWindow .

Вот быстрый пример того, как правильно отобразить другое 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
    }
}
  

Кстати. вам не нужно создавать UIWindow в AppDelegate . Это зависит от поведения вашего кода.

Ответ №5:

попробуйте этот код…

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