我使用Eureka在iOS中使用Swift构建表单。我创建了一个多值部分,例如:
form +++ MultivaluedSection(multivaluedOptions: [.Insert, .Delete], header: "My Header", footer: "My footer") { section in
section.tag = "mySectionTag"
section.addButtonProvider = { _ in
return ButtonRow() { row in
row.title = "Add row"
}
}
section.multivaluedRowToInsertAt = { index in
return TimeInlineRow() { row in
row.title = "My row title"
}
}
// initialize form with any times that have already been set previously, times: [Date]
for time in times {
section <<< TimeInlineRow(tag) { row in
row.value = time
row.title = "My row title"
}
}
我想限制您可以插入多值部分的行数。考虑通过使用某种ButtonRow
隐藏Condition
来实现这一点,但我不确定如何连接它。或者,如果您在该部分中values()
的计数过高时点击按钮行,则可以只显示警告,但是如何阻止实际插入?
还在考虑我可以根据索引在multivaluedRowToInsertAt
内做一些事情,但仍然不确定是什么。
仔细研究这些问题,并且很惊讶没有发现任何问题,所以我只能假设我错过了一些明显的东西。
我的另一个想法是在Condition
中的ButtonRow
上设置addButtonProvider
,如果具有特定最大行标记的行(我创建的)不是nil,则返回true在表单中(即不存在这样的行),然后在multivaluedRowToInsertAt
中它将检查索引是否大于最大允许索引,如果是,则在创建该行时应用max标记。但似乎绿色+插入按钮会自动应用于该部分的最后一行,而不管其类型如何。然后,当尝试达到最大行时,我尝试将multivaluedOptions
更改为.Delete
,但我无法弄清楚如何让它返回到删除行后允许插入。< / p>
还尝试根据与上面类似的方法(具有最大行)在ButtonRow
的禁用属性上添加条件,但它也会遇到重复的行标记问题,绿色添加按钮仍然存在响应点击,showInsertIconInAddButton
属性无效。
即使我使用这种方法,它似乎也不必要地复杂化,我希望有一个更简单的解决方案,因为它似乎是很多人需要的那种功能。
答案 0 :(得分:5)
如Mahbub's answer中所述并在原始问题中暗示,可以检查multivaluedRowToInsertAt
块中的索引并更新multivaluedOptions
并相应地隐藏按钮行。
FormViewController
中的属性:
private var myButtonRow: ButtonRow! // Can also just refer to it by tag
let kMaxCount = 5
在FormViewController
中的设置功能中:(未显示,设置部分/按钮行/添加提供程序等)
section.multivaluedRowToInsertAt = { index in
if index >= self.kMaxCount - 1 {
section.multivaluedOptions = [.Delete]
self.myButtonRow.hidden = true
DispatchQueue.main.async() { // I'm not sure why this is necessary
self.myButtonRow.evaluateHidden()
}
}
return TimeRow() { row in // any row type you want — although inline rows probably mess this up
row.title = title
row.value = Date()
}
}
multivaluedRowToInsertAt
内部按钮行的更改似乎在添加第6行之前保持不变,无论何时调用隐藏方法以及最大计数设置为何,以及最后一行插入位于倒数第二位。然后我尝试了上面编写的代码,调度调用延迟evaluateHidden()
,它似乎工作。我不确定为什么,可能是一些相互矛盾的竞争条件。注意,当调用insert方法时,它位于主线程上,因此它不是要在后台线程上更改UI。
然后,当删除行时,有一个名为rowsHaveBeenRemoved
的函数,您可以在FormViewController
子类中覆盖,只要删除了一行(在任何部分中),就会调用该函数:
override func rowsHaveBeenRemoved(_ rows: [BaseRow], at indexes: [IndexPath]) {
super.rowsHaveBeenRemoved(rows, at: indexes)
if let index = indexes.first?.section, let section = form.allSections[index] as? MultivaluedSection {
if section.count < kMaxCount {
section.multivaluedOptions = [.Insert, .Delete]
myButtonRow.hidden = false // or could
myButtonRow.evaluateHidden()
}
}
}
答案 1 :(得分:2)
这是如何限制多值部分中的行数的:
section.multivaluedRowToInsertAt = { index in if index > 2 { let multiValuedSection = self?.form.sectionBy(tag: "MultivaluedSectionTag") as! MultivaluedSection multiValuedSection.multivaluedOptions = [.Reorder, .Delete] self?.form.rowBy(tag: "AddButtonProviderTag")?.hidden = true self?.form.rowBy(tag: "AddButtonProviderTag")?.evaluateHidden() } // Do other stuff }