Swift 在应用程序运行时动态更改NSWindow标题

Swift 在应用程序运行时动态更改NSWindow标题,swift,macos,wkwebview,nswindow,nswindowcontroller,Swift,Macos,Wkwebview,Nswindow,Nswindowcontroller,我想创建一个应用程序,其中NSWindow的标题反映WKWebView的页面标题值。然而,我在设置窗口标题时遇到了一些问题,比如viewDidLoad、viewWillAppear等初始化方法之外的设置。到目前为止,我已经做到了以下几点: ViewController.swift import Cocoa import WebKit class ViewController: NSViewController, WKUIDelegate, WKNavigationDelegate, NSWin

我想创建一个应用程序,其中NSWindow的标题反映WKWebView的页面标题值。然而,我在设置窗口标题时遇到了一些问题,比如viewDidLoad、viewWillAppear等初始化方法之外的设置。到目前为止,我已经做到了以下几点:

ViewController.swift

import Cocoa
import WebKit

class ViewController: NSViewController, WKUIDelegate, WKNavigationDelegate, NSWindowDelegate {

    @IBOutlet var webView: WKWebView!
    var webViewTitleObserver: NSKeyValueObservation?
    let windowController: WindowController = WindowController()

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.navigationDelegate = self
        webView.uiDelegate = self

        let preferences = WKPreferences()
        preferences.javaScriptEnabled = true
        preferences.javaScriptCanOpenWindowsAutomatically = true
        let configuration = WKWebViewConfiguration()
        configuration.preferences = preferences

        webView.load("https://google.com")

        // WebView Title Observer
        webViewTitleObserver = self.observe(\.webView.title, options: .new) { webView, change in
            let title = "\(String(describing: change.newValue))"
            ViewController().titleChange(pageTitle: title)
        }
    }

    override func viewWillAppear() {
        self.view.window?.delegate = self
    }

    func titleChange(pageTitle: String) {
        //self.view.window?.delegate = self
        print("Start Title:", pageTitle)
        // Fix Optional URL String
        var title = pageTitle.replacingOccurrences(of: "Optional", with: "")
        let brackets: Set<Character> = ["(", ")"]
        title.removeAll(where: { brackets.contains($0) })
        print("Clean Title:", title)

        self.view.window?.title = title
        self.view.window?.update()
    }
}


// MARK: Extensions

// WKWebView Extension
extension WKWebView {
    func load(_ urlString: String) {
        if let url = URL(string: urlString) {
            let request = URLRequest(url: url)
            load(request)
        }
    }
}
但是,窗口的标题拒绝在titleChange函数中更改。为什么会这样

WindowController.swift(如果需要)


我做错了什么?

您正在观察者中创建一个新的视图控制器:

ViewController().titleChange(pageTitle: title)
并对其调用
titleChange()
。因此,由于这是一个新的控制器,它没有窗口,与当前显示的视图层次结构无关

要修复此问题,请将您的观察者更新为以下内容:

// WebView Title Observer
webViewTitleObserver = self.observe(\.webView.title, options: .new) { [weak self] webView, change in
    let title = "\(String(describing: change.newValue))"
    self?.titleChange(pageTitle: title)
}
我已经更改了参数并捕获了
self
引用,然后对其调用
titleChange()
函数。在这种情况下,将在屏幕上看到的控制器上调用self.view.window?.title=title

ViewController().titleChange(pageTitle: title)
// WebView Title Observer
webViewTitleObserver = self.observe(\.webView.title, options: .new) { [weak self] webView, change in
    let title = "\(String(describing: change.newValue))"
    self?.titleChange(pageTitle: title)
}