shi*_*him 11 ios swift eureka-forms
我正在使用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"
}
}
Run Code Online (Sandbox Code Playgroud)
我想限制你可以插入多值部分的行数.正在考虑通过隐藏ButtonRow使用某种Condition方式来实现它,但我不确定如何连接它.或者,如果values()在部分中的计数过高时点击按钮行,则可以仅显示警报,但是如何阻止实际插入?
还考虑到我可以multivaluedRowToInsertAt根据索引做一些内幕但仍然不确定是什么.
仔细研究了这些问题并且很惊讶没有找到任何关于这个的东西,所以我只能假设我遗漏了一些明显的东西.
另一种认为我是设置Condition在ButtonRow中addButtonProvider,返回true,如果具有一定的最大行代码(我创建)行不为零的形式(即没有这样的行存在),然后在multivaluedRowToInsertAt它会检查如果索引大于最大允许索引,如果是,则在创建该行时应用max标记.但似乎绿色+插入按钮会自动应用于该部分的最后一行,而不管其类型如何.然后我尝试更改multivaluedOptions到.Delete达到最大行时,但是我无法弄清楚如何让它返回到允许在删除行之后插入.
还尝试ButtonRow基于与上面类似的方法(具有最大行)将条件放在已禁用的属性上,但它也会遇到重复的行标记问题,并且绿色添加按钮仍然响应点击,并且该showInsertIconInAddButton属性无效.
即使我使用这种方法,它似乎也不必要地复杂化,我希望有一个更简单的解决方案,因为它似乎是很多人需要的那种功能.
正如Mahbub的回答中所述,并在原始问题中暗示,可以检查multivaluedRowToInsertAt块中的索引并相应地更新multivaluedOptions和隐藏按钮行.
物业FormViewController:
private var myButtonRow: ButtonRow! // Can also just refer to it by tag
let kMaxCount = 5
Run Code Online (Sandbox Code Playgroud)
在以下设置功能中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()
}
}
Run Code Online (Sandbox Code Playgroud)
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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1117 次 |
| 最近记录: |