#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) Я показал, как передать выделение в навигационную ссылку