当段发生变化时,如何在 Eureka 中更新我的列表?
How can I update my list in Eureka when the segment is changing?
我制作了一个带有检查行列表和两个部分的表单,用户可以在其中选择 select 列表中的所有项目或 none。
private func setupForm() -> Void {
guard let inheritorList = getInheritorList() else {
return
}
form +++ Section()
<<< LabelRow() { row in
row.title = "Choose between multiple inheritors"
}
<<< SegmentedRow<Int>("segments") { row in
row.options = [1,2]
row.displayValueFor = { idx in
if idx == 1 {
return "All"
} else {
return "None"
}
}
}
.onChange({ row in
if row.value! == 1 {
//All checkboxes should be selected
self.inheritorFilterMode = .filterAll
} else {
//All checkboxes should be deselected
self.inheritorFilterMode = .filterNone
}
})
for inheritor in inheritorList {
form.last! <<< CheckRow("inheritors") { listRow in
listRow.title = inheritor.name
listRow.value = nil
}
.onChange({ row in
if row.value! {
self.inheritorsArray.insert(row.tag!)
} else {
self.inheritorsArray.remove(row.tag!)
}
})
}
}
这将创建一个列表,其中包含上面指定的继承人列表和两个段。
我的问题是我不知道如何获取分段行的值。
我尝试创建一个枚举并根据分段行方法的 onChange 中的值更改过滤模式。稍后我会在我的 check row 列表的 onChange 中检查哪个模式处于活动状态,但这没有用。
enum InheritorFilterMode {
case filterAll, filterNone
}
...
var inheritorFilterMode: InheritorFilterMode = .filterAll
我也试过通过获取tag来获取segments的值:
let segmentedRow: SegmentedRow<Int>! = self.form.rowBy(tag: "segments")
但这种方法并不奏效。
关于段更改时如何更新复选框有什么建议吗?
我不太确定我是否理解了这个问题。不过我会尽量回答的。
复选标记本身只是一个附件类型,它改变了行的值(查看repo以供参考:
accessoryType = row.value == true ? .checkmark : .none
因此,与其过滤结果(这不应该像您那样工作),不如循环处理表单中的所有行。有一种方法 form.allRows() 允许您遍历表单中的所有行,然后您只需要检查哪个段 - 在您的情况下为“全部”或“ None" - 已选中:
所以在 onChange 块中你的 SegmentedRow 你可以做这样的事情:
.onChange({ segmentedRow in
for row in self.form.allRows {
if row is CheckRow {
if segmentedRow.value == "All" {
row.baseValue = true
} else if segmentedRow.value == "None" {
row.baseValue = false
}
// don't forget to call update cell - otherwise the cell won't update
row.updateCell()
}
}
})
此外:您可以使用 String:
而不是使用基于 Interger 的行类型
<<< SegmentedRow<String>("yourTagHere") { (segment) in
segment.options = ["All","None"]
...
我自己没有测试过,但应该可以。我花了 10 分钟阅读 GitHub 上的 Eureka 文档。可能值得一试 ;)
我制作了一个带有检查行列表和两个部分的表单,用户可以在其中选择 select 列表中的所有项目或 none。
private func setupForm() -> Void {
guard let inheritorList = getInheritorList() else {
return
}
form +++ Section()
<<< LabelRow() { row in
row.title = "Choose between multiple inheritors"
}
<<< SegmentedRow<Int>("segments") { row in
row.options = [1,2]
row.displayValueFor = { idx in
if idx == 1 {
return "All"
} else {
return "None"
}
}
}
.onChange({ row in
if row.value! == 1 {
//All checkboxes should be selected
self.inheritorFilterMode = .filterAll
} else {
//All checkboxes should be deselected
self.inheritorFilterMode = .filterNone
}
})
for inheritor in inheritorList {
form.last! <<< CheckRow("inheritors") { listRow in
listRow.title = inheritor.name
listRow.value = nil
}
.onChange({ row in
if row.value! {
self.inheritorsArray.insert(row.tag!)
} else {
self.inheritorsArray.remove(row.tag!)
}
})
}
}
这将创建一个列表,其中包含上面指定的继承人列表和两个段。 我的问题是我不知道如何获取分段行的值。
我尝试创建一个枚举并根据分段行方法的 onChange 中的值更改过滤模式。稍后我会在我的 check row 列表的 onChange 中检查哪个模式处于活动状态,但这没有用。
enum InheritorFilterMode {
case filterAll, filterNone
}
...
var inheritorFilterMode: InheritorFilterMode = .filterAll
我也试过通过获取tag来获取segments的值:
let segmentedRow: SegmentedRow<Int>! = self.form.rowBy(tag: "segments")
但这种方法并不奏效。
关于段更改时如何更新复选框有什么建议吗?
我不太确定我是否理解了这个问题。不过我会尽量回答的。
复选标记本身只是一个附件类型,它改变了行的值(查看repo以供参考:
accessoryType = row.value == true ? .checkmark : .none
因此,与其过滤结果(这不应该像您那样工作),不如循环处理表单中的所有行。有一种方法 form.allRows() 允许您遍历表单中的所有行,然后您只需要检查哪个段 - 在您的情况下为“全部”或“ None" - 已选中:
所以在 onChange 块中你的 SegmentedRow 你可以做这样的事情:
.onChange({ segmentedRow in
for row in self.form.allRows {
if row is CheckRow {
if segmentedRow.value == "All" {
row.baseValue = true
} else if segmentedRow.value == "None" {
row.baseValue = false
}
// don't forget to call update cell - otherwise the cell won't update
row.updateCell()
}
}
})
此外:您可以使用 String:
而不是使用基于 Interger 的行类型<<< SegmentedRow<String>("yourTagHere") { (segment) in
segment.options = ["All","None"]
...
我自己没有测试过,但应该可以。我花了 10 分钟阅读 GitHub 上的 Eureka 文档。可能值得一试 ;)