Swift 在应用程序运行时动态更改NSWindow标题
我想创建一个应用程序,其中NSWindow的标题反映WKWebView的页面标题值。然而,我在设置窗口标题时遇到了一些问题,比如viewDidLoad、viewWillAppear等初始化方法之外的设置。到目前为止,我已经做到了以下几点: ViewController.swiftSwift 在应用程序运行时动态更改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
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)
}