Swift 5 & Xcode 11
Jadi di xCode 11 solusi window tidak lagi valid di dalam appDelegate. Mereka memindahkan ini ke SceneDelgate. Anda dapat menemukannya di file SceneDelgate.swift.
Anda akan melihat sekarang ada var window: UIWindow?
hadiah.
Dalam situasi saya, saya menggunakan TabBarController dari storyboard dan ingin mengaturnya sebagai rootViewController.
Ini kode saya:
sceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
self.window = self.window ?? UIWindow()//@JA- If this scene's self.window is nil then set a new UIWindow object to it.
//@Grab the storyboard and ensure that the tab bar controller is reinstantiated with the details below.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tabBarController = storyboard.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController
for child in tabBarController.viewControllers ?? [] {
if let top = child as? StateControllerProtocol {
print("State Controller Passed To:")
print(child.title!)
top.setState(state: stateController)
}
}
self.window!.rootViewController = tabBarController //Set the rootViewController to our modified version with the StateController instances
self.window!.makeKeyAndVisible()
print("Finished scene setting code")
guard let _ = (scene as? UIWindowScene) else { return }
}
Pastikan untuk menambahkan ini ke metode adegan yang benar seperti yang saya lakukan di sini. Perhatikan bahwa Anda perlu mengatur nama pengenal untuk tabBarController atau viewController yang Anda gunakan di storyboard.
Dalam kasus saya, saya melakukan ini untuk mengatur stateController untuk melacak variabel yang dibagi di antara tampilan tab. Jika Anda ingin melakukan hal yang sama, tambahkan kode berikut ...
StateController.swift
import Foundation
struct tdfvars{
var rbe:Double = 1.4
var t1half:Double = 1.5
var alphaBetaLate:Double = 3.0
var alphaBetaAcute:Double = 10.0
var totalDose:Double = 6000.00
var dosePerFraction:Double = 200.0
var numOfFractions:Double = 30
var totalTime:Double = 168
var ldrDose:Double = 8500.0
}
//@JA - Protocol that view controllers should have that defines that it should have a function to setState
protocol StateControllerProtocol {
func setState(state: StateController)
}
class StateController {
var tdfvariables:tdfvars = tdfvars()
}
Catatan: Cukup gunakan variabel Anda sendiri atau apa pun yang Anda coba untuk melacaknya, saya hanya mendaftarkan milik saya sebagai contoh di tdfvariables struct.
Di setiap tampilan TabController tambahkan variabel anggota berikut.
class SettingsViewController: UIViewController {
var stateController: StateController?
.... }
Kemudian pada file-file yang sama tambahkan berikut ini:
extension SettingsViewController: StateControllerProtocol {
func setState(state: StateController) {
self.stateController = state
}
}
Apa yang dilakukan adalah memungkinkan Anda untuk menghindari pendekatan tunggal untuk melewatkan variabel di antara tampilan. Hal ini memungkinkan dengan mudah untuk model injeksi ketergantungan yang jauh lebih baik daripada pendekatan tunggal.