В приложении MacOS, использующем SwiftUI, как изменить синий фон по умолчанию для выбранной ссылки NavigationLink, вложенной в список? - PullRequest
0 голосов
/ 19 апреля 2020

Добрый день всем. В приложении MacOS, использующем SwiftUI, как изменить синий фон по умолчанию для выбранной ссылки NavigationLink, вложенной в список? Список находится внутри NavigationView. Я не мог найти решение здесь. Какой код можно добавить в следующий базовый c пример: в списке два TextView, и если мы щелкнем TextView, мы отобразим соответствующий View.

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

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

Вот результат, если мы нажмем на первую строку ... фон будет выделен синим цветом! Как изменить этот цвет по умолчанию? Заранее благодарим за помощь.

enter image description here

1 Ответ

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

следующий код является одним из вариантов для достижения того, что вы хотите:

struct ContentView: View {

@State var selection: Int? = 0
@State var pressed: Int? = 0

init() {
    UITableViewCell.appearance().selectionStyle = .none
    UITableView.appearance().backgroundColor = UIColor.clear
}

var body: some View {

    var theBinding = Binding(
        get: { self.selection },
        set: {
            self.selection = $0
            self.pressed = $0 == nil ? self.pressed : $0!
    })

    return HStack() {
        NavigationView {
            List {
                NavigationLink(destination: FirstView(), tag: 0, selection: theBinding) {
                    Text("Click Me To Display The First View")
                }.listRowBackground(self.pressed == 0 ? Color.red : Color.green)

                NavigationLink(destination: SecondView(), tag: 1, selection: theBinding) {
                    Text("Click Me To Display The Second View")
                }.listRowBackground(self.pressed == 1 ? Color.red : Color.green)

            }.frame(minWidth: 350, maxWidth: 350)
                .onAppear { self.pressed = 0 }

        }.listStyle(SidebarListStyle())
         .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}
}
...