Reputation: 4198
I have two separate Xcode projects that I'm using to learn SwiftUI:
The following code creates a simple NavigationView
with master-detail views:
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
It works as expected on iOS 👍
But on the macOS project the same code as above doesn't work the same way 🤯
When I launch the app on Mac, I get this window
And when I click on any row, the detail view just collapses/disappears, never showing me detail view.
Any ideas how to fix this? Maybe I'm missing something? Or perhaps this is just a bug?
Upvotes: 15
Views: 13827
Reputation: 51
NavigationSplitView
A view that presents views in two or three columns, where selections in leading columns control presentations in subsequent columns.
Upvotes: 2
Reputation: 7204
Here is my code that seems to fix it using 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)
}
}
}
This makes a window like this:
Upvotes: 10
Reputation: 126
I don't have the answer but I'm trying to do the same thing and have a few observations to add, maybe they will help:
Add a destination View:
NavigationButton(destination: DetailView()) {
Text("Show Detail")
}
Setting a width on the NavigationView stops the right-hand view from disappearing.
Also, adding
.onAppear { print("DetailView called") }
to the detail view shows that, even though it isn't being displayed, the view is in fact called when the button is clicked.
Edit: it's there! The view was hidden by the divider, drag it left to see the detail view.
Edit 2: Xcode beta 2 gives a "'NavigationView' is unavailable in macOS" message.
Upvotes: 4