1

と の 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)ませんでした。

4

1 に答える 1