Swift 5 & Xcode 11
ดังนั้นใน xCode 11 โซลูชันหน้าต่างจะไม่สามารถใช้งานได้ภายใน appDelegate พวกเขาย้ายสิ่งนี้ไปที่ SceneDelgate คุณสามารถหาสิ่งนี้ได้ในไฟล์ SceneDelgate.swift
คุณจะสังเกตได้ว่าตอนนี้มีvar window: UIWindow?
ของขวัญ
ในสถานการณ์ของฉันฉันใช้ TabBarController จากกระดานเรื่องราวและต้องการตั้งเป็น rootViewController
นี่คือรหัสของฉัน:
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 }
}
ตรวจสอบให้แน่ใจว่าได้เพิ่มสิ่งนี้ลงในวิธีฉากที่ถูกต้องเหมือนที่ฉันทำที่นี่ โปรดทราบว่าคุณจะต้องตั้งชื่อตัวระบุสำหรับ tabBarController หรือ viewController ที่คุณใช้ในกระดานเรื่องราว
ในกรณีของฉันฉันกำลังทำสิ่งนี้เพื่อตั้ง stateController เพื่อติดตามตัวแปรที่แชร์กันระหว่างมุมมองแท็บ หากคุณต้องการทำสิ่งเดียวกันนี้ให้เพิ่มรหัสต่อไปนี้ ...
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()
}
หมายเหตุ: เพียงแค่ใช้ตัวแปรของคุณเองหรืออะไรก็ตามที่คุณพยายามติดตามแทนฉันเพิ่งแสดงรายการของฉันเป็นตัวอย่างในโครงสร้าง tdfvariables
ในแต่ละมุมมองของ TabController เพิ่มตัวแปรสมาชิกต่อไปนี้
class SettingsViewController: UIViewController {
var stateController: StateController?
.... }
จากนั้นในไฟล์เดียวกันเหล่านั้นให้เพิ่มสิ่งต่อไปนี้:
extension SettingsViewController: StateControllerProtocol {
func setState(state: StateController) {
self.stateController = state
}
}
สิ่งนี้จะช่วยให้คุณหลีกเลี่ยงวิธีการเดี่ยวในการส่งผ่านตัวแปรระหว่างมุมมอง วิธีนี้ช่วยให้ง่ายสำหรับโมเดลการฉีดพึ่งพาซึ่งเป็นวิธีที่ดีกว่าในระยะยาวและแบบซิงเกิล