У меня есть супер простое приложение SwiftUI master-detail:
import SwiftUI
struct ContentView: View {
@State private var imageNames = [String]()
var body: some View {
NavigationView {
MasterView(imageNames: $imageNames)
.navigationBarTitle(Text("Master"))
.navigationBarItems(
leading: EditButton(),
trailing: Button(
action: {
withAnimation {
// simplified for example
self.imageNames.insert("image", at: 0)
}
}
) {
Image(systemName: "plus")
}
)
}
}
}
struct MasterView: View {
@Binding var imageNames: [String]
var body: some View {
List {
ForEach(imageNames, id: \.self) { imageName in
NavigationLink(
destination: DetailView(selectedImageName: imageName)
) {
Text(imageName)
}
}
}
}
}
struct DetailView: View {
var selectedImageName: String
var body: some View {
Image(selectedImageName)
}
}
Я также настраиваю прокси-сервер внешнего вида в SceneDelegate для цвета панели навигации "
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithOpaqueBackground()
navBarAppearance.shadowColor = UIColor.systemYellow
navBarAppearance.backgroundColor = UIColor.systemYellow
navBarAppearance.shadowImage = UIImage()
UINavigationBar.appearance().standardAppearance = navBarAppearance
UINavigationBar.appearance().scrollEdgeAppearance = navBarAppearance
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
Теперь я бы хотел, чтобы цвет фона панели навигации изменился и стал очищаться при появлении подробного представления. Мне все еще нужна кнопка «Назад» в этом представлении, поэтому скрытие панели навигации не является идеальным решением. Я также хотел бы, чтобы изменение применялось только к подробному представлению, поэтому, когда я открываю это представление, прокси-сервер внешнего вида должен вступать во владение, и если я sh передаю другому контроллеру, тогда прокси-сервер внешнего вида также должен действовать.
Я пробовал всевозможные вещи: - Изменение прокси внешнего вида на didAppear
- Обертывание подробного представления в UIViewControllerRepresentable
(ограниченный успех, я могу добраться до панели навигации и изменить ее цвет, но по какой-то причине имеется более одного контроллера навигации)
Есть ли простой способ сделать это в SwiftUI?