1

With iOS 13 the setter for screen was deprecated, and there's not much documentation out there that says what the alternative should be. I have looked at other stack overflow posts such as this one but the code does not function in my app. This is the function I have in my view controller to set up external displays, which works, but warns me that the setter has been deprecated for screen. It is called in the viewDidLoad() function of my ViewController.

Variables initialized in my ViewController

    // External Display Support
    var secondWindow: UIWindow?
    var secondScreenView: UIView?

Function to connect and display to external screen.

    @objc func setupScreen() {
        if UIScreen.screens.count > 1 {
            // Find and store the second screen
            let secondScreen = UIScreen.screens[1]
            
            // Create a local variable to store the second window using the screen's dimensions
            let externalWindow = UIWindow(frame: secondScreen.bounds)
            
            // Windows require a root view controller
            let viewController = UIViewController()
            
            // Tell the window which screen to use
            externalWindow.screen = secondScreen // This is where the deprecation error is
            
            // Set the dimensions for the view for the external screen so it fills the screen
            secondScreenView = UIView(frame: externalWindow.frame)
            
            // Add the view to the window
            externalWindow.addSubview(secondScreenView)
            
            // Unhinde the window
            externalWindow.isHidden = false
            
            // Configure the View
            let hostingController = HostingControllerPresentable(rootView: DefaultPresentationView(appIcon: Bundle.main.icon ?? UIImage()))
            
            viewController.addChild(hostingController)
            viewController.view.addSubview(hostingController.view)
            hostingController.view.translatesAutoresizingMaskIntoConstraints = false
            
            NSLayoutConstraint.activate([
                hostingController.view.topAnchor.constraint(equalTo: (viewController.view.topAnchor)),
                hostingController.view.bottomAnchor.constraint(equalTo: (viewController.view.bottomAnchor)),
                hostingController.view.leadingAnchor.constraint(equalTo: (viewController.view.leadingAnchor)),
                hostingController.view.trailingAnchor.constraint(equalTo: (viewController.view.trailingAnchor)),
            ])
            
            hostingController.didMove(toParent: externalWindow.rootViewController)
            secondWindow = externalWindow
            externalWindow.rootViewController = viewController
        }
    }

What replaces this setter, and how do I need to update the code for this to work?

JoshHolme
  • 303
  • 2
  • 15
  • Have you adopted the scene delegate in your app? If so then you assign the external screen to the `screen` property of the relevant `UIWindowScene`. If you haven't adopted the scene delegate approach then use the code you have and ignore the deprecation warning – Paulw11 Mar 02 '21 at 03:09
  • We have not adopted scene delegate. We'll have to look into adopting that then. Thank you for the clarification and the information! – JoshHolme Mar 02 '21 at 03:17

0 Answers0