Как изменить TintColor из NavigationBar только на один экран - PullRequest
0 голосов
/ 29 марта 2020

Я хочу изменить TintColor панели навигации.

В следующей реализации я хочу изменить только «DetailView», но также изменяется цвет экрана «EditView».

Как мне поменять только один экран?

struct TopView: View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: DetailView()) {
                    Text("Detail")
                }
            }
            .navigationBarTitle("Top")
        }
    }
}

struct DetailView: View {
    init(title: String) {
        UINavigationBar.appearance().tintColor = UIColor(named: "White")
    }

    var body: some View {
        VStack {
            NavigationLink(destination: EditView()) {
                Text("Edit")
            }
        }
        .navigationBarTitle("Detail", displayMode: .inline)
    }
}

struct EditView: View {
    @Environment(\.presentationMode) private var presentationMode: Binding<PresentationMode>

    var body: some View {
        VStack {
            Text("Title")
        }
        .navigationBarTitle("Edit", displayMode: .inline)
        .navigationBarItems(
            trailing:
            Button(action: {
                self.presentationMode.wrappedValue.dismiss()
            }) {
                Text("Save")
            }
        )
    }
}

1 Ответ

0 голосов
/ 29 марта 2020

Если я правильно понимаю вопрос, то это может быть решением. Он работает, выясняя, где мы находимся в стеке навигации, а затем изменяя цвет акцента в зависимости от положения. Это меняет цвет кнопок панели навигации. Если вы полагаетесь на цвет акцента для других вещей, вам нужно это переопределить, и я проиллюстрировал это на EditView. (Я оставил некоторые записи, чтобы вы могли увидеть, как это работает.)

enter image description here

enum ViewShowing : String {
      case top
      case detail
      case edit
}

class ViewShowingModel : ObservableObject {
      @Published var showing = ViewShowing.top
}

struct ContentView: View {

      @ObservedObject var viewModel = ViewShowingModel()

      var body: some View {

            return NavigationView {
                  VStack {
                        NavigationLink(destination: DetailView(title: "Detail", viewModel: viewModel)) {
                              Text("Go to: Detail")
                        }
                        Text("viewShowing: \(viewModel.showing.rawValue)")

                  }.onAppear(perform: {
                        print("top appear")
                        self.viewModel.showing = .top
                  })
                        .navigationBarTitle("Top").accentColorForView(viewModel.showing)
            }.accentColorForView(viewModel.showing)
      }
}


struct DetailView: View {

      var title : String
      @ObservedObject var viewModel : ViewShowingModel

      var body: some View {

            return VStack {
                  NavigationLink(destination: EditView(viewModel: viewModel)) {
                        Text("Go to Edit: \(title)")

                  }
                  Text("viewShowing: \(viewModel.showing.rawValue)")
                        .navigationBarTitle("\(title)", displayMode: .inline)
            }
            .onAppear(perform: {
                  print("detail appear")
                  self.viewModel.showing = .detail })
      }
}


struct EditView: View {
      @ObservedObject var viewModel : ViewShowingModel

      @Environment(\.presentationMode) private var presentationMode: Binding<PresentationMode>
      var body: some View {
            VStack {
                  Text("Editing View")
                  Text("viewShowing: \(viewModel.showing.rawValue)")

                  Button(action: {
                        self.presentationMode.wrappedValue.dismiss()
                  }) {
                        Text("A Dismiss Button (no color override)")
                  }.padding()

                  Button(action: {
                        self.presentationMode.wrappedValue.dismiss()
                  }) {
                        Text("Another Dismiss Button (color override)").foregroundColor(Color(UIColor.systemBlue))
                  }.padding()

            }
            .navigationBarTitle("Edit", displayMode: .inline)
            .navigationBarItems(
                  trailing:
                  Button(action: {
                        self.presentationMode.wrappedValue.dismiss()
                  }) {
                        Text("Save")
                  }
            )
                  .onAppear(perform: {
                        print("edit appear")
                        self.viewModel.showing = .edit
                  })
      }
}

extension View {

      func accentColorForView(_ viewShowing : ViewShowing) -> some View {
            switch viewShowing {
            case .detail :
                  return accentColor(Color.red)
            case .top :
                  return accentColor(Color.purple)
            case .edit :
                  return accentColor(Color.green)
            }
      }
}

struct ContentView_Previews: PreviewProvider {
      static var previews: some View {
            ContentView()
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...