РЕДАКТИРОВАТЬ: решил изменить подход:
Привет, я создал пункт меню в моем приложении MacOS SwiftUI для "www.google.com".
Я использовал AppDelegate. быстро добавить
@IBAction func google(_ sender: Any) {
WebBrowserView.load(url: URL(string: "http://www.google.com")!)
}
(что дает мне ошибку
Instance member 'load' cannot be used on type 'WebBrowserView';
did you mean to use a value of this type instead?
)
ContentView.swift говорит:
struct BrowserView: View {
private let browser = WebBrowserView()
var body: some View {
HStack {
browser
.onAppear() {
self.browser.load(url: URL(string: "http://duckduckgo.com")!)
}
}
.padding()
}
}
I Мы также сопоставили пункт меню google.com с First Responder в Main.Storyboard и сопоставили его с функцией google
Но когда я нажимаю на элемент главного меню google.com - ничего не происходит. Что я здесь не так делаю?
Сначала я попытался скопировать всю структуру BrowserView из ContentView в AppDelegate и обернуть ее внутри @IBAction, но, похоже, это тоже не сработало.
РЕДАКТИРОВАТЬ: Чтобы избежать ошибки, я попытался это сделать:
import Cocoa
import SwiftUI
import WebKit
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
private let browser = WebBrowserView()
@IBAction func google(_ sender: Any) {
self.browser.load(url: URL(string: "http://www.google.com")!)
}
, но, хотя у меня больше нет ошибки, нажатие на пункт главного меню ничего не делает.
Затем я решил попробовать еще одну пробную версию, которая заключается в том, чтобы поместить все в applicationDidFinishLaunching в AppDelegate @IBAction
.
@IBAction func duckduckgo(_ sender: Any) {
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
window.title = "XReach WebClient https://duckduckgo.com"
self.browser.load(url: URL(string: "http://duckduckgo.com")!)
}
Теперь, когда это успешно меняет заголовок на duckduck go, браузер по-прежнему загружает предыдущую Вместо этого URL.
Какой самый чистый способ сделать это?