проблемы с отображением разных заголовков на панели навигации

#swift #foreach #navigation #swiftui

#swift #foreach #навигация #swiftui

Вопрос:

в моем коде у меня есть это:

 var body: some View {
   NavigationView {
        VStack(spacing: 0) {
           
        
            ScrollView(.vertical, showsIndicators: false) {
            VStack(spacing: 18) {
                ScrollView(.horizontal, showsIndicators: false){
                    HStack(spacing: 20){
                        Text("teste")
                        .frame(height: 180)
                        .frame(width: 330)
                        .background(Color.blue)
                       .cornerRadius(15)
                        Text("teste")
                        .frame(height: 180)
                        .frame(width: 330)
                        .background(Color.green)
                        .cornerRadius(15)
                        Text("teste")
                        .frame(height: 180)
                        .frame(width: 330)
                        .background(Color.pink)
                        .cornerRadius(15)
                     
                    }.padding(.horizontal, 12)
                }
                ForEach(specialtyList, id: .type){ specialty in
                    
                    NavigationLink (destination: SearchBar(item: specialty)){
                        VStack(spacing: 18) {
            HStack{
                
                Text(specialty.type).foregroundColor(.white)
                specialty.image
                .renderingMode(.original)
                    .resizable()
                    .frame(width: 35, height: 35)
                  
                
               }.frame(minWidth: 0, idealWidth: 350, maxWidth: .infinity)
                .frame(height: 100)
                        }
                  
                    }.padding(.horizontal)
                        .background(specialty.color).cornerRadius(45)
                   
            
                }.padding(.horizontal)
            }
           
            .padding(.top)
            .padding(.bottom)
                                        
            }
            
    }.navigationBarTitle("Buscar")
            
   
        
   }.accentColor(.black)
}
  

Я хочу, чтобы в соответствии с кнопкой, которая нажата в ForEach, заголовок следующего представления — это название кнопки. Теперь в каждой кнопке отображается название «Buscar»
Я попытался реализовать после ForEach и перед NavigationLink NavigationView, но отверстие ForEach исчезает. В принципе, я хочу, чтобы нажатый текст (specialty.type) был названием кнопки возврата на панели навигации. Есть идеи?

Комментарии:

1. Пожалуйста, публикуйте обновления, о которых идет речь, по соглашению.

Ответ №1:

Вот демонстрация возможного подхода — идея состоит в том, чтобы изменить заголовок панели навигации при активации ссылки навигации и сбросить его обратно.

Демо подготовлено и протестировано с Xcode 12 / iOS 14

ДЕМОНСТРАЦИЯ

 struct DemoView: View {
    @State private var barTitle = ""
    @State private var selectedType = ""
    @State private var isActive = false

    let types = ["Type1", "Type2", "Type3"]

    var body: some View {
        NavigationView {
            VStack {
                ForEach(types, id: .self) { type in
                    Button(type) {
                        self.isActive = true
                        self.selectedType = type
                        self.barTitle = type         // comment for variant 2
                    }
                }
            }
            .background(
                NavigationLink(destination:
                    Text(selectedType)
//                        .onAppear { self.barTitle = self.selectedType } // variant 2
                    , isActive: $isActive) { EmptyView() }
            )
            .navigationBarTitle(barTitle)
            .onAppear {
                self.barTitle = "Buscar"
            }
        }
    }
}
  

Комментарии:

1. Это сработало. Но будете ли вы помещать навигационную ссылку в фоновом режиме?

2. так что это ни на что не повлияло

3. хорошо, но теперь, после обновления моего кода, у меня возникли 2 проблемы: 1-я, до изменений, всякий раз, когда я нажимал на фрейм, я переходил к другому представлению. Теперь мне нужно щелкнуть точно по названию фрейма. 2-й, раньше внутри NavigationLink у меня был пункт назначения (item: specialty), и теперь он не работает. Обновленный код будет отредактирован в вопросе

4. 1) добавить .frame(maxWidth: .infinity) для кнопки 2) Я показал, как передать выделение в навигационную ссылку