Swiftui navigationLink macOS по умолчанию / выбранное состояние - PullRequest
3 голосов
/ 09 февраля 2020

Я создаю приложение MacOS на swiftui

Я пытаюсь создать просмотр списка, в котором предварительно выбран первый элемент. я попробовал это с 'выбранным' состоянием навигационной ссылки, но это не работало.

Я в значительной степени невежественен и надеюсь, что вы, ребята, сможете мне помочь.

Код для создания этого списка выглядит следующим образом.

//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)
          }
    }
}

(Другие виды внизу)

Это обычный вид при открытии приложения. appnormalstate Когда я нажимаю на элемент, он открывается вот так. Это состояние, которое я хочу использовать в качестве состояния открытия по умолчанию при отображении этого представления. appwantedstate

Код для этого представления выглядит следующим образом:

//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()
    }
}

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 09 февраля 2020

рабочий пример. Посмотрите, как инициализируется выделение

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 {
                        self.selection = 0
                    }
                }.frame(width: 100)
            }
        }.background(Color.init(NSColor.controlBackgroundColor))
    }
}

снимок экрана enter image description here

3 голосов
/ 09 февраля 2020

Вы можете определить привязку к выбранной строке и использовать Список, читающий этот выбор. Затем вы инициализируете выделение первому человеку в массиве персон.

Обратите внимание, что в macOS вы не используете NavigationLink, вместо этого вы условно отображаете подробный вид с оператором if внутри NavigationView .

Если человек не может быть идентифицирован, вы должны добавить id: \.self в l oop. Это выглядит следующим образом:

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)
    }
  }
}

Затем в главном окне:

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!)
      }
    }
  }
}

Ваш структурный сотрудник должен быть Hashable, чтобы быть отмеченным в списке. Если ваш тип достаточно прост, добавьте соответствие Hashable:

struct Person: Hashable {
  var name: String
  // ...
}

Есть хороший учебник, использующий тот же принцип здесь , если вы хотите более полный пример.

1 голос
/ 18 апреля 2020

Благодаря этому обсуждению, как начинающий MacOS, я управлял очень простым c 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()
  }
}

Результат:

enter image description here

...