- 仍然不知道它是如何选择显示它们的方式
- 没有简单的方法可以做到这一点。您需要在其中创建超级视图并更改子视图。某事喜欢:
@SceneBuilder var body: some Scene {
WindowGroup {
NavigatorView()
}
}
enum DisplayedScene {
case Browser
case Status(url: URL)
}
struct NavigatorView: View {
@State var displayedScene = DisplayedScene.Browser
var body: some View {
VStack {
switch(model.displayedScene) {
case DisplayedScene.Browser:
BrowserView(model: browserViewModel, wndId: id)
case DisplayedScene.Status(let url):
VStack {
StatusView(url: url, wndId: id)
Button("back") { AppCore.signals.send(signal: Signal.TaoGit.Navigator.ShowBrowser(wndId: id) ) }
}
default:
Text("ERROR")
}
}.transition(.identity)
.animation(.easeInOut)
}
}
所以你需要改变显示的视图就是发送信号来改变displayedScene
。
另一种方法是将 displayScene 设置为EnvironmentVariable
. 但在这种情况下,您将只能正确使用一个窗口实例。所以这是一个不好的方法。但对某人来说可以。
- 如何使用 SwiftUI 在新窗口中打开第二个场景?- 没有简单的方法可以做到这一点。你需要使用
handlesExternalEvents
. 样本:
import SwiftUI
@main
struct TestAppApp: App {
var body: some Scene {
WindowGroup {
MainView()
}
.handlesExternalEvents(matching: Set(arrayLiteral: Wnd.mainView.rawValue))
WindowGroup {
HelperView()
}
.handlesExternalEvents(matching: Set(arrayLiteral: Wnd.helperView.rawValue))
}
}
extension TestAppApp {
struct MainView: View {
@Environment(\.openURL) var openURL
var body: some View {
VStack {
Button("Open Main View") {
Wnd.mainView.open()
}
Button("Open Other View") {
Wnd.helperView.open()
}
}
.padding(150)
}
}
struct HelperView: View {
var body: some View {
HStack {
Text("This is ") + Text("Helper View!").bold()
}
.padding(150)
}
}
}
enum Wnd: String, CaseIterable {
case mainView = "MainView"
case helperView = "OtherView"
func open(){
if let url = URL(string: "taotao://\(self.rawValue)") {
print("opening \(self.rawValue)")
NSWorkspace.shared.open(url)
}
}
}
为什么我们需要 WindowGroup?它不只是一组视图吗?-- 它告诉 swiftUI 这个视图可以显示为单独的窗口。
一般如何与他们合作?- 只有很多黑客。看起来 SwiftUI 在 MacOS 上的效果真的很差。