Проблемы с UIScene и ViewController - PullRequest
0 голосов
/ 31 марта 2020

Я изменил свое приложение для создания нового windows с помощью App Exposé или путем перетаскивания из дока. Но кажется, что мой viewcontroller и сцена выходят из строя c. Я подтвердил это, напечатав уникальный persistentIdentifier, который поставляется с каждым сеансом сцены. Я использую раскадровки, поэтому мой делегат сцены довольно прост.

@available(iOS 13.0, *)  
class SceneDelegate: UIResponder, UIWindowSceneDelegate {  
 var window: UIWindow?  

  func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {  

    let rootVC = self.window?.rootViewController  

    dPrint("\(#function) rootVC \(String(describing: rootVC!)) pId \((scene as? UIWindowScene)?.session.persistentIde}ntifier ?? "??" )")  

     }  
}  

Вот мой info.plist

<key>UIMainStoryboardFile</key>  
  <string>Main</string>  
  <key>UIApplicationSceneManifest</key>  
  <dict>  
  <key>UIApplicationSupportsMultipleScenes</key>  
  <true/>  
  <key>UISceneConfigurations</key>  
  <dict>  
  <key>UIWindowSceneSessionRoleApplication</key>  
  <array>  
  <dict>  
  <key>UISceneConfigurationName</key>  
  <string>Default Configuration</string>  
  <key>UISceneDelegateClassName</key>  
  <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>  
  <key>UISceneStoryboardFile</key>  
  <string>Main</string>  
  </dict>  
  </array>  
  </dict>  
  </dict>  

И AppDelegate:

  func application(_ application: UIApplication,  
                   configurationForConnecting connectingSceneSession: UISceneSession,  
                   options: UIScene.ConnectionOptions) -> UISceneConfiguration {  


    // Based on the name of the configuration iOS will initialize the correct SceneDelegate  
    return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)  
  }  

Я удаляю приложение из симулятора, чтобы начать с чистого Scenerio. Я открываю приложение, и создается начальная сцена. Я печатаю его постоянный идентификатор и его: 67926371-9D25-46D C -BD52-8D44B1967B33. Я использую немного, и соответствующий persistentIdentifier показывает. Все хорошо!

Теперь я go на главном экране показываю все windows (отображается только одна) и выбираю кнопку «плюс» в правом верхнем углу, чтобы создать еще одну сцену / окно. Новая сцена создается и получает свой собственный persistentIdentifier: B73F438D-942F-435 C -87E7-117BF6E06C79.

Я использую приложение, и отображается соответствующий persistentIdentifier (для вновь созданной сцены). Теперь я go на главном экране показываю все windows и выбираю изначально созданную сцену. Но теперь показанный persistentIdentifier все еще один для второй сцены! После создания второй сцены мой пользовательский интерфейс всегда показывает persistentIdentifier для второй сцены, независимо от того, какая сцена находится на переднем плане.

Это фактически второе приложение, в которое я добавляю поддержку нескольких окон. Итак, у меня есть некоторый опыт в этом. Первое приложение было похожим: раскадровка на основе, et c. Работает отлично. Я проверил, что persistentIdentifier, как предполагается, следует за контроллером представления.

Похоже, что контроллеры сцены и представления не синхронизированы c. Почему это происходит? Чего мне не хватает?

...