首页 > 解决方案 > SwiftUI 2:在新窗口中打开视图的方式

问题描述

让我们想象一下我有一个应用程序

var storeVM = BookStoreViewModel(bla1: bla1, bla2: bla2, bla3: bla3)

@SceneBuilder var body: some Scene {
    WindowGroup {
        BookStoreView( model: storeVM )
    }
    
    #if os(macOS)
    Settings {
        SettingsView(model: config)
    }   
    #endif
}

BookStore 有一个网格,其中有很多书籍保存在一些数据库中。

BookView 可以通过以下方式启动:

BookView(model: bookViewModel)

目标:在新的分离窗口中打开 BookView(例如单击按钮)。我怎样才能做到这一点?


奖励问题:如何SettingsView(model: config)从代码中打开?


PS:NavigationLink对我来说不是解决方案,因为我没有使用NavigationView.

标签: swiftmacosnavigationswiftuiscene

解决方案


我找到了这个答案,它对我来说可以打开一个新窗口:https ://developer.apple.com/forums/thread/651592?answerId=651132022#651132022

我在xcode 12.3, Swift 5.3, 运行大苏尔。

以下是如何设置的示例,以便ContentView可以使用按钮打开OtherView窗口。

@main
struct testApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        WindowGroup("OtherView") {
            OtherView()
        }
        .handlesExternalEvents(matching: Set(arrayLiteral: "*"))
    }
}

struct ContentView: View {
    @Environment(\.openURL) var openURL

    var body: some View {
       Button("Other View") {
           if let url = URL(string: "test://otherview") {
               openURL(url)
           }
       }
    }
}

struct OtherView: View {
    var body: some View {
        Text("Other View!")
    }
}

注意:确保遵循链接答案中包含的 URL 方案说明(为方便起见,此处引用):

现在在 Project->Info->URL Typestest中输入 URL Schemes 字段(以及标识符字段)以向系统注册我们的应用程序。

我通过编辑Info.plist文件并在那里进行添加来实现这一点,即URL types-> URL Schemes...:

信息列表


推荐阅读