Swiftui navigationLink macOS default/selected 状态
Swiftui navigationLink macOS default/selected state
我在 swiftui 中构建了一个 macOS 应用程序
我尝试创建一个列表视图,其中预选了第一项。我用 'selected' 状态的 navigationLink 尝试了它,但它没有用。
我是一头雾水,希望大家帮帮我。
创建此列表视图的代码如下所示。
//personList
struct PersonList: View {
var body: some View {
NavigationView
{
List(personData) { person in
NavigationLink(destination: PersonDetail(person: person))
{
PersonRow(person: person)
}
}.frame(minWidth: 300, maxWidth: 300)
}
}
}
(底部其他视图)
这是我打开应用程序时的正常视图。
当我点击一个项目时,它会像这样打开。 这就是我在呈现此视图时想要作为默认打开状态的状态。
此视图的代码如下所示:
//PersonRow
struct PersonRow: View {
//variables definied
var person: Person
var body: some View {
HStack
{
person.image.resizable().frame(width:50, height:50)
.cornerRadius(25)
.padding(5)
VStack (alignment: .leading)
{
Text(person.firstName + " " + person.lastName)
.fontWeight(.bold)
.padding(5)
Text(person.nickname)
.padding(5)
}
Spacer()
}
}
}
//personDetail
struct PersonDetail: View {
var person : Person
var body: some View {
VStack
{
HStack
{
VStack
{
CircleImage(image: person.image)
Text(person.firstName + " " + person.lastName)
.font(.title)
Text("Turtle Rock")
.font(.subheadline)
}
Spacer()
Text("Subtitle")
.font(.subheadline)
}
Spacer()
}
.padding()
}
}
提前致谢!
您可以定义到所选行的绑定并使用读取此选择的列表。然后您将选择初始化为您的人员数组中的第一个人。
请注意,在 macOS 上您不使用 NavigationLink
,而是在 NavigationView
.
中使用 if
语句有条件地显示详细信息视图
如果人员不可识别,您应该在循环中添加一个 id: \.self
。这相当于:
struct PersonList: View {
@Binding var selectedPerson: Person?
var body: some View {
List(persons, id: \.self, selection: $selectedPerson) { person in // persons is an array of persons
PersonRow(person: person).tag(person)
}
}
}
然后在你的主 window:
struct ContentView: View {
// First cell will be highlighted and selected
@State private var selectedPerson: Person? = person[0]
var body: some View {
NavigationView {
PersonList(selectedPerson: $selectedPerson)
if selectedPerson != nil {
PersonDetail(person: person!)
}
}
}
}
你的 struct person 应该是 Hashable 以便在列表中被标记。如果您的类型足够简单,添加 Hashable 一致性就足够了:
struct Person: Hashable {
var name: String
// ...
}
如果您想要更完整的示例,可以使用相同的原理here 找到一个很好的教程。
工作示例。查看选择是如何初始化的
import SwiftUI
struct Detail: View {
let i: Int
var body: some View {
Text("\(self.i)").font(.system(size: 150)).frame(maxWidth: .infinity)
}
}
struct ContentView: View {
@State var selection: Int?
var body: some View {
HStack(alignment: .top) {
NavigationView {
List {
ForEach(0 ..< 10) { (i) in
NavigationLink(destination: Detail(i: i), tag: i, selection: self.$selection) {
VStack {
Text("Row \(i)")
Divider()
}
}
}.onAppear {
if self.selection != nil {
self.selection = 0
}
}
}.frame(width: 100)
}
}.background(Color.init(NSColor.controlBackgroundColor))
}
}
截图
感谢这次讨论,作为 MacOS 初学者,我管理了一个非常基本的 NavigationView,其中包含一个包含两个 NavigationLink 的列表,可以在两个视图之间进行选择。我把它变得非常基础,以便更好地理解。它可能会帮助其他初学者。
在启动时,它将是第一个显示的视图。
只需将 ContentView.swift, self.selection = 0 修改为 self.selection = 1 即可开始第二个视图。
FirstView.swift
import SwiftUI
struct FirstView: View {
var body: some View {
Text("(1) Hello, I am the first view")
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct FirstView_Previews: PreviewProvider {
static var previews: some View {
FirstView()
}
}
SecondView.swift
import SwiftUI
struct SecondView: View {
var body: some View {
Text("(2) Hello, I am the second View")
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct SecondView_Previews: PreviewProvider {
static var previews: some View {
SecondView()
}
}
ContentView.swift
import SwiftUI
struct ContentView: View {
@State var selection: Int?
var body: some View {
HStack() {
NavigationView {
List () {
NavigationLink(destination: FirstView(), tag: 0, selection: self.$selection) {
Text("Click Me To Display The First View")
} // End Navigation Link
NavigationLink(destination: SecondView(), tag: 1, selection: self.$selection) {
Text("Click Me To Display The Second View")
} // End Navigation Link
} // End list
.frame(minWidth: 350, maxWidth: 350)
.onAppear {
self.selection = 0
}
} // End NavigationView
.listStyle(SidebarListStyle())
.frame(maxWidth: .infinity, maxHeight: .infinity)
} // End HStack
} // End some View
} // End ContentView
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
结果:
import SwiftUI
struct User: Identifiable {
let id: Int
let name: String
}
struct ContentView: View {
@State private var users: [User] = (1...10).map { User(id: [=10=], name: "user \([=10=])")}
@State private var selection: User.ID?
var body: some View {
NavigationView {
List(users) { user in
NavigationLink(tag: user.id, selection: $selection) {
Text("\(user.name)'s DetailView")
} label: {
Text(user.name)
}
}
Text("Select one")
}
.onAppear {
if let selection = users.first?.ID {
self.selection = selection
}
}
}
}
您可以使用 onAppear(见上文)进行默认选择。
我在 swiftui 中构建了一个 macOS 应用程序
我尝试创建一个列表视图,其中预选了第一项。我用 'selected' 状态的 navigationLink 尝试了它,但它没有用。
我是一头雾水,希望大家帮帮我。
创建此列表视图的代码如下所示。
//personList
struct PersonList: View {
var body: some View {
NavigationView
{
List(personData) { person in
NavigationLink(destination: PersonDetail(person: person))
{
PersonRow(person: person)
}
}.frame(minWidth: 300, maxWidth: 300)
}
}
}
(底部其他视图)
这是我打开应用程序时的正常视图。
此视图的代码如下所示:
//PersonRow
struct PersonRow: View {
//variables definied
var person: Person
var body: some View {
HStack
{
person.image.resizable().frame(width:50, height:50)
.cornerRadius(25)
.padding(5)
VStack (alignment: .leading)
{
Text(person.firstName + " " + person.lastName)
.fontWeight(.bold)
.padding(5)
Text(person.nickname)
.padding(5)
}
Spacer()
}
}
}
//personDetail
struct PersonDetail: View {
var person : Person
var body: some View {
VStack
{
HStack
{
VStack
{
CircleImage(image: person.image)
Text(person.firstName + " " + person.lastName)
.font(.title)
Text("Turtle Rock")
.font(.subheadline)
}
Spacer()
Text("Subtitle")
.font(.subheadline)
}
Spacer()
}
.padding()
}
}
提前致谢!
您可以定义到所选行的绑定并使用读取此选择的列表。然后您将选择初始化为您的人员数组中的第一个人。
请注意,在 macOS 上您不使用 NavigationLink
,而是在 NavigationView
.
if
语句有条件地显示详细信息视图
如果人员不可识别,您应该在循环中添加一个 id: \.self
。这相当于:
struct PersonList: View {
@Binding var selectedPerson: Person?
var body: some View {
List(persons, id: \.self, selection: $selectedPerson) { person in // persons is an array of persons
PersonRow(person: person).tag(person)
}
}
}
然后在你的主 window:
struct ContentView: View {
// First cell will be highlighted and selected
@State private var selectedPerson: Person? = person[0]
var body: some View {
NavigationView {
PersonList(selectedPerson: $selectedPerson)
if selectedPerson != nil {
PersonDetail(person: person!)
}
}
}
}
你的 struct person 应该是 Hashable 以便在列表中被标记。如果您的类型足够简单,添加 Hashable 一致性就足够了:
struct Person: Hashable {
var name: String
// ...
}
如果您想要更完整的示例,可以使用相同的原理here 找到一个很好的教程。
工作示例。查看选择是如何初始化的
import SwiftUI
struct Detail: View {
let i: Int
var body: some View {
Text("\(self.i)").font(.system(size: 150)).frame(maxWidth: .infinity)
}
}
struct ContentView: View {
@State var selection: Int?
var body: some View {
HStack(alignment: .top) {
NavigationView {
List {
ForEach(0 ..< 10) { (i) in
NavigationLink(destination: Detail(i: i), tag: i, selection: self.$selection) {
VStack {
Text("Row \(i)")
Divider()
}
}
}.onAppear {
if self.selection != nil {
self.selection = 0
}
}
}.frame(width: 100)
}
}.background(Color.init(NSColor.controlBackgroundColor))
}
}
截图
感谢这次讨论,作为 MacOS 初学者,我管理了一个非常基本的 NavigationView,其中包含一个包含两个 NavigationLink 的列表,可以在两个视图之间进行选择。我把它变得非常基础,以便更好地理解。它可能会帮助其他初学者。 在启动时,它将是第一个显示的视图。 只需将 ContentView.swift, self.selection = 0 修改为 self.selection = 1 即可开始第二个视图。
FirstView.swift
import SwiftUI
struct FirstView: View {
var body: some View {
Text("(1) Hello, I am the first view")
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct FirstView_Previews: PreviewProvider {
static var previews: some View {
FirstView()
}
}
SecondView.swift
import SwiftUI
struct SecondView: View {
var body: some View {
Text("(2) Hello, I am the second View")
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct SecondView_Previews: PreviewProvider {
static var previews: some View {
SecondView()
}
}
ContentView.swift
import SwiftUI
struct ContentView: View {
@State var selection: Int?
var body: some View {
HStack() {
NavigationView {
List () {
NavigationLink(destination: FirstView(), tag: 0, selection: self.$selection) {
Text("Click Me To Display The First View")
} // End Navigation Link
NavigationLink(destination: SecondView(), tag: 1, selection: self.$selection) {
Text("Click Me To Display The Second View")
} // End Navigation Link
} // End list
.frame(minWidth: 350, maxWidth: 350)
.onAppear {
self.selection = 0
}
} // End NavigationView
.listStyle(SidebarListStyle())
.frame(maxWidth: .infinity, maxHeight: .infinity)
} // End HStack
} // End some View
} // End ContentView
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
结果:
import SwiftUI
struct User: Identifiable {
let id: Int
let name: String
}
struct ContentView: View {
@State private var users: [User] = (1...10).map { User(id: [=10=], name: "user \([=10=])")}
@State private var selection: User.ID?
var body: some View {
NavigationView {
List(users) { user in
NavigationLink(tag: user.id, selection: $selection) {
Text("\(user.name)'s DetailView")
} label: {
Text(user.name)
}
}
Text("Select one")
}
.onAppear {
if let selection = users.first?.ID {
self.selection = selection
}
}
}
}
您可以使用 onAppear(见上文)进行默认选择。