[英]failed to perform a ViewController's segue from AppDelegate by using delegate
[英]Using strong delegate for initial ViewController in AppDelegate
我最初的GameViewController
具有的委托属性GameDelegate
。 我在AppDelegate
设置此属性:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
//Set initial view controller
window = UIWindow(frame: UIScreen.main.bounds)
if let window = window {
let gameTracker = GameTracker()
let gameViewController = GameViewController()
gameViewController.delegate = gameTracker
window.rootViewController = gameViewController
window.makeKeyAndVisible()
}
return true
}
这仅在我的代表很强时才起作用:
class GameViewController: UIViewController{
var delegate: GameDelegate?
var gameScore: GameScore {
return (delegate!.gameScore)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
使用弱的委托将导致应用程序崩溃,因为在呈现GameViewController
之后委托将为零。
我的问题是:这种方法安全吗?如果不安全,应该怎么做? 我已经阅读了有关委托的内容,建议将其保留为弱变量,以防止保留周期。 我没有使用情节提要。
问题在于您是在函数中而不是在类级变量中声明gameTracker
。 当函数退出时, AppDelegate
对它的引用将立即释放,而GameViewController
仅有其引用。
解决此问题的方法是在您的AppDelegate
gameTracker
声明为类级变量:
var gameTracker: GameTracker?
您需要将其声明为可选的,因为您只想在满足if
条件时实例化它:
if let window = window {
self.gameTracker = GameTracker()
let gameViewController = GameViewController()
gameViewController.delegate = self.gameTracker
window.rootViewController = gameViewController
window.makeKeyAndVisible()
}
如果执行此操作,则可以在GameViewController
中将delegate
声明为weak
。
安全的方法是使用弱委托。 如果您处理nil,那应该不是问题。
weak var delegate: GameDelegate?
var gameScore: GameScore? {
return delegate?.gameScore
}
您是否打算在'gameScore'更改时调用'delegate'? 如果要保存“ gameScore”并返回“ delegate”,则应使用属性观察器。
var gameScore: GameScore {
didSet {
delegate?.gameScore
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.