Open10

VisionOSのウィンドウを最前面にしたい

さくたまさくたま

やりたいこと

左のウィンドウをクリックして右側のウィンドウ内の情報を更新
右側のウィンドウが最前面に来てほしい

さくたまさくたま
DispatchQueue.main.async {
        // windowの中身が右側のWindowになってるか確認
        print("!!!!!!!!!!!before makeKey!!!!!!!!!!!")
        print(sceneDelegate.windows)
        print(sceneDelegate.window)
        sceneDelegate.window!.makeKeyAndVisible()
        print("!!!!!!!!!!!right window!!!!!!!!!!!")
        print(sceneDelegate.window)
        print(sceneDelegate.window?.isKeyWindow)
        sceneDelegate.window?.rootViewController?.restoresFocusAfterTransition
 }

sceneDelegate.window!.makeKeyAndVisible()
makeKeyAndVisible前後でWindowが変わらない

さくたまさくたま

https://developer.apple.com/documentation/swiftui/uiapplicationdelegateadaptor/
これを参考にして

final class AppDelegate: NSObject, UIApplicationDelegate, ObservableObject {
    
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        let configuration = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
        configuration.delegateClass = SceneDelegate.self
        return configuration
    }
    
}

final class SceneDelegate: NSObject, UIWindowSceneDelegate, ObservableObject {
    var window: UIWindow?
    var windows: [UIWindow]?
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        window = (scene as? UIWindowScene)?.keyWindow
        
        windows = (scene as? UIWindowScene)?.windows
     }
}
さくたまさくたま

こうしてみると,

①アプリが起動して一つ目のウィンドウが出た時
windowは一つ目のウィンドウ
②二つ目のウィンドウが出た時
windowは二つ目のウィンドウ

それ以外は前面のウィンドウを入れ替えても何も起きない
消しても何も起きない

さくたまさくたま

課題

  • ウィンドウを最前面に持ってくるメソッドはmakeKeyAndVisibleではないかもしれないので方法を探す
  • ウィンドウの状態変化を監視できる場所はどこ?
さくたまさくたま
  • scene.windowsには期待するような左のウィンドウ,右のウィンドウ,という情報が入っているわけではない