在以下代码中,导航/列表视图与从第二个视图生成的单元格一起显示。第一次调用时,以模态显示,View将按预期方式渲染,并且一切都会按预期进行。选择复选标记出现并适当消失。
点击“新建”按钮转到“模态视图”,该视图创建一个新的“调整”。该视图将重置绑定变量showTuningEditor。重置将退出“模态视图”。另外,由于它是State,所以它会重新渲染TuningSelectorView。
重新渲染的视图中出现两个问题。
列表中的某些(不是全部)单元格不再响应应引起选择的轻击。分接头代码从不执行。我看不到确定哪些条目失去点击响应的模式。选择4、5或6个字符串,然后再次选择“任意”将恢复点击手势。以这种方式重新渲染后,它们可以再次工作。
有时,几个单元在列表中会排错位置。这也可以选择任何,4,5,或6以上的字符串时出现。转到4、5或6,然后返回到Any有时会导致单元格放置错误。
我不明白为什么会这样。我想象的唯一情况是,可能会选择性地重新渲染视图,即仅重新渲染代码认为已受影响的部分。还有什么可能的原因?这些解决方法是什么?
struct TuningSelector: View {
@Binding var presentTuningSelector: Bool
@State private var showTuningEditor = false
@State private var numberOfStrings = 0
private let tunings = Tunings.shared
@State var selected: String = ""
init (_ presentTuningSelector: Binding<Bool>) {
self._presentTuningSelector = presentTuningSelector
UITableView.appearance().backgroundColor = UIColor.listBG
selected = Tunings.shared.currentTuning.id
}
var body: some View {
NavigationView {
VStack {
Picker("", selection: self.$numberOfStrings) {
Text("Any").tag(0)
Text("4").tag(4)
Text("5").tag(5)
Text("6").tag(6)
}
.pickerStyle(SegmentedPickerStyle())
.padding()
List {
if (self.numberOfStrings == 0 || self.numberOfStrings == 4) {
Section(header: Text("4 Strings")) {
ForEach(tunings.t4.indices, id: \.self) { index in
TuningCell(selected: self.$selected,
tuning: self.tunings.t4[index]
)
}
.listRowBackground(Color.listBG)
}
}
if (self.numberOfStrings == 0 || self.numberOfStrings == 5) {
Section(header: Text("5 Strings")) {
ForEach(tunings.t5.indices, id: \.self) { index in
TuningCell(selected: self.$selected,
tuning: self.tunings.t5[index]
)
}
.listRowBackground(Color.listBG)
}
}
if (self.numberOfStrings == 0 || self.numberOfStrings == 6) {
Section(header: Text("6 Strings")) {
ForEach(tunings.t6.indices, id: \.self) { index in
TuningCell(selected: self.$selected,
tuning: self.tunings.t6[index]
)
}
}
.listRowBackground(Color.listBG)
}
} // List
.navigationBarTitle(Text("Tunings"), displayMode: .inline)
.navigationBarItems(
leading:
Button(action: { self.presentTuningSelector = false }) {
HStack {
Image(systemName: "arrow.left")
Text("Back")
}
},
trailing:
Button("New") {
self.showTuningEditor = true
}
.sheet(isPresented: self.$showTuningEditor) {
TuningEditorView(showTuningEditor: self.$showTuningEditor)
}
)
} //VStack
}
}
}
struct TuningCell: View {
@Binding var selected: String
let tuning: Tuning
var body: some View {
HStack{
if (self.selected == self.tuning.id) {
Image(systemName: "checkmark")
.frame(width: 15)
} else {
Rectangle()
.foregroundColor(Color.listBG)
.frame(width: 15)
}
Text(self.tuning.name)
Spacer()
Text(self.tuning.desc())
Image(systemName: "square.and.pencil")
.onTapGesture {
print("Edit " + self.tuning.name)
}
}
.contentShape(Rectangle())
.background(Color.clear)
.onTapGesture {
self.tuning.select()
self.selected = self.tuning.id
print("Selected: " + self.tuning.name)
}
}
}