SwiftUI:如何在 macOS 中使用 NavigationView?
SwiftUI: how to use NavigationView in macOS?
我有两个单独的 Xcode 项目用于学习 SwiftUI:
- Mac 上的一个真正的 macOS 项目(不是 Catalyst)。
- 一个 iOS 项目(iPhone)。
以下代码创建了一个简单的 NavigationView
主从视图:
import SwiftUI
struct ListView : View {
var body: some View {
NavigationView {
List() {
NavigationButton(destination: Text("detail 1")) {
Text("row 1")
}
NavigationButton(destination: Text("detail 2")) {
Text("row 2")
}
}
}
}
}
#if DEBUG
struct ListView_Previews : PreviewProvider {
static var previews: some View {
ListView()
}
}
#endif
它在 iOS
上按预期工作
但在 macOS 项目上,与上面相同的代码的工作方式不同
当我在 Mac 上启动应用程序时,我得到了这个 window
当我点击任何一行时,详细视图只是 collapses/disappears,从不显示详细视图。
有什么解决办法吗?也许我错过了什么?或许这只是一个错误?
我没有答案,但我正在尝试做同样的事情并且有一些观察要补充,也许它们会有所帮助:
添加目标视图:
NavigationButton(destination: DetailView()) {
Text("Show Detail")
}
在 NavigationView 上设置宽度可阻止 right-hand 视图消失。
此外,添加
.onAppear { print("DetailView called") }
详细视图表明,即使没有显示,但实际上在单击按钮时会调用该视图。
编辑:它就在那里!视图被分隔线隐藏,向左拖动可查看详细视图。
编辑 2:Xcode beta 2 给出“'NavigationView' 在 macOS 中不可用”消息。
这是我的代码,似乎使用 Xcode 12.2 beta 3 修复了它:
import SwiftUI
var listItems = ["Item 1", "Item 2", "Item 3", "Item 4"]
var secondItems = ["Second 1", "Second 2", "Second 3", "Second 4"]
struct ContentView: View
{
@State var select: String? = "Item 1"
var body: some View
{
VStack
{
NavigationView
{
List
{
ForEach((0..<listItems.count), id: \.self)
{index in
NavigationLink(destination: SecondView(), tag: listItems[index], selection: $select)
{
Text(listItems[index])
.padding(.vertical, 2.0)
}
}
Spacer()
}.frame(width:160)
.listStyle(SidebarListStyle())
}
.toolbar
{
Text("this is not the title")
Button(action: {})
{
Label("Upload", systemImage: "square.and.arrow.up")
}
}
.navigationTitle("My Title")
.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}
}
struct SecondView: View {
var body: some View {
NavigationView {
List
{
ForEach((0..<secondItems.count), id: \.self)
{index in
NavigationLink(destination: Text(secondItems[index]))
{
Text(secondItems[index])
.frame(height: 20)
}
}
}.frame(width:150)
}
}
}
这使得 window 像这样:
我有两个单独的 Xcode 项目用于学习 SwiftUI:
- Mac 上的一个真正的 macOS 项目(不是 Catalyst)。
- 一个 iOS 项目(iPhone)。
以下代码创建了一个简单的 NavigationView
主从视图:
import SwiftUI
struct ListView : View {
var body: some View {
NavigationView {
List() {
NavigationButton(destination: Text("detail 1")) {
Text("row 1")
}
NavigationButton(destination: Text("detail 2")) {
Text("row 2")
}
}
}
}
}
#if DEBUG
struct ListView_Previews : PreviewProvider {
static var previews: some View {
ListView()
}
}
#endif
它在 iOS
上按预期工作但在 macOS 项目上,与上面相同的代码的工作方式不同
当我在 Mac 上启动应用程序时,我得到了这个 window
当我点击任何一行时,详细视图只是 collapses/disappears,从不显示详细视图。
有什么解决办法吗?也许我错过了什么?或许这只是一个错误?
我没有答案,但我正在尝试做同样的事情并且有一些观察要补充,也许它们会有所帮助:
添加目标视图:
NavigationButton(destination: DetailView()) {
Text("Show Detail")
}
在 NavigationView 上设置宽度可阻止 right-hand 视图消失。
此外,添加
.onAppear { print("DetailView called") }
详细视图表明,即使没有显示,但实际上在单击按钮时会调用该视图。
编辑:它就在那里!视图被分隔线隐藏,向左拖动可查看详细视图。
编辑 2:Xcode beta 2 给出“'NavigationView' 在 macOS 中不可用”消息。
这是我的代码,似乎使用 Xcode 12.2 beta 3 修复了它:
import SwiftUI
var listItems = ["Item 1", "Item 2", "Item 3", "Item 4"]
var secondItems = ["Second 1", "Second 2", "Second 3", "Second 4"]
struct ContentView: View
{
@State var select: String? = "Item 1"
var body: some View
{
VStack
{
NavigationView
{
List
{
ForEach((0..<listItems.count), id: \.self)
{index in
NavigationLink(destination: SecondView(), tag: listItems[index], selection: $select)
{
Text(listItems[index])
.padding(.vertical, 2.0)
}
}
Spacer()
}.frame(width:160)
.listStyle(SidebarListStyle())
}
.toolbar
{
Text("this is not the title")
Button(action: {})
{
Label("Upload", systemImage: "square.and.arrow.up")
}
}
.navigationTitle("My Title")
.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}
}
struct SecondView: View {
var body: some View {
NavigationView {
List
{
ForEach((0..<secondItems.count), id: \.self)
{index in
NavigationLink(destination: Text(secondItems[index]))
{
Text(secondItems[index])
.frame(height: 20)
}
}
}.frame(width:150)
}
}
}
这使得 window 像这样: