と の 2 つの WebView がwebView
ありcustomizerWebView
ます。これらの WKWebView は両方とも、末尾の制約によって関連付けられています。基本的に、メニューに移動して「Show Customizer」showCustomizer()
または「Hide Customizer」をクリックhideCustomizer()
すると、それぞれの関数が呼び出され、関連するすべてのものを表示または非表示にしcustomizerWebView
ます。
明確にするために、添付された からこれらの関数を呼び出すと、すべてが期待どおりに機能し、アニメーション化されNSMenuItems
ます。ただし、本質的に URL を検出するオブザーバーから呼び出された場合show/hideCustomizer()
、つまり. -コードurl.contains("#close")
の最初の行でアプリがクラッシュし、次のエラーが表示されます。animator()
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
ViewController.swift
import Cocoa
import WebKit
class ViewController: NSViewController, WKUIDelegate, WKNavigationDelegate {
var customizerURLObserver: NSKeyValueObservation?
@IBOutlet var webView: WKWebView!
@IBOutlet var customizerWebView: WKWebView!
@IBOutlet var rightConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad
...
customizerURLObserver = customizerWebView.observe(\.url, options: .new) { webView, change in
let url = "\(String(describing: change.newValue))"
ViewController().urlDidChange(urlString: url) }
}
func urlDidChange(urlString: String) {
let url = cleanURL(urlString)
if url.contains("#close") { hideCustomizer() } // Observer call to hide function
}
@IBAction func showCustomizerMenu(_ sender: Any) { showCustomizer() } // These work flawlessly
@IBAction func hideCustomizerMenu(_ sender: Any) { hideCustomizer() } // These work flawlessly
func showCustomizer() {
let customTimeFunction = CAMediaTimingFunction(controlPoints: 5/6, 0.2, 2/6, 0.9)
NSAnimationContext.runAnimationGroup({(_ context: NSAnimationContext) -> Void in
context.timingFunction = customTimeFunction
context.duration = 0.3
rightConstraint.animator().constant = 280
customizerWebView.animator().isHidden = false
webView.animator().alphaValue = 0.6
}, completionHandler: {() -> Void in
})
}
func hideCustomizer() {
let customTimeFunction = CAMediaTimingFunction(controlPoints: 5/6, 0.2, 2/6, 0.9)
NSAnimationContext.runAnimationGroup({(_ context: NSAnimationContext) -> Void in
context.timingFunction = customTimeFunction
context.duration = 0.3
webView.animator().alphaValue = 1 // Found nil crash highlights this line
rightConstraint.animator().constant = 0
}, completionHandler: {() -> Void in
self.customizerWebView.isHidden = true
})
}
}
このアニメーションが NSMenu から 100 回呼び出されると問題なく表示さhideCustomizer()
れ、機能するのに、Observer 関数から 1 回呼び出されるとクラッシュする理由を教えてください。
NSMenu object function の呼び出しも試みましたが、役に立ちhideCustomizerMenu(self)
ませんでした。