Swift Eureka forms:如何限制多值部分中的行数?

Posted

技术标签:

【中文标题】Swift Eureka forms:如何限制多值部分中的行数?【英文标题】:Swift Eureka forms: how do you limit the number of rows in a multivalued section? 【发布时间】:2017-12-21 20:32:51 【问题描述】:

我正在使用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"
    

我想限制可以插入我的多值部分的行数。正在考虑通过使用某种Condition 隐藏ButtonRow 来做到这一点,但我不知道如何连接它。或者,如果您在该部分中values() 的计数过高时点击按钮行,则可以只显示警报,但是您如何阻止实际插入?

还在考虑我可以根据索引在multivaluedRowToInsertAt 内做一些事情,但仍然不确定是什么。

浏览了这些问题,很惊讶没有找到任何关于此的内容,所以我只能假设我遗漏了一些明显的东西。

我的另一个想法是在addButtonProvider 中的ButtonRow 上设置Condition,如果具有某个最大行标记(我创建)的行在表单中不为零(即没有这样的行存在),然后在multivaluedRowToInsertAt 中检查索引是否大于最大允许索引,如果是,则在创建该行时应用最大标记。但无论类型如何,似乎绿色+插入按钮都会自动应用于该部分的最后一行。然后,当达到最大行数时,我尝试将 multivaluedOptions 更改为 .Delete,但我无法弄清楚如何让它在删除一行后返回允许插入。

还尝试根据与上述类似的方法(使用最大行)对ButtonRow 的 disabled 属性设置条件,但它也会遇到重复行标记问题,并且绿色添加按钮仍然响应点击,并且showInsertIconInAddButton 属性无效。

即使我让这个方法起作用,它似乎也不必要地令人费解,我本来希望有一个更简单的解决方案,因为这似乎是很多人需要的那种功能。

【问题讨论】:

您可以尝试使用 Section 委托函数 rowsHaveBeenAdded 和 rowsHaveBeenRemoved 来显示/隐藏 ButtonRow。 好的,谢谢。这是我今天早些时候一直在尝试的东西,尽管我遇到了一些意外的崩溃。如果我有任何地方会更新帖子。 好吧,祝你好运! 由于忘记调用超级实现导致意外崩溃:D 在按钮行设置.hidden = true(通过form.rowBy(tag:)检索)没有任何效果。 【参考方案1】:

如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 个有价值的行),您可以使用类似的方法并将多值选项设置为 @987654333 @ 仅在基于section.countrowsHaveBeenRemoved 中(请记住,如果按钮行可见,计数包括按钮行)。 Note about "DispatchQueue.main.async() // 我不知道为什么这是必要的 self.myButtonRow.evaluateHidden() " --> 如果你不使用 dispatch async ,插入新字段后的活动字段位置错误。【参考方案2】:

这是如何限制多值部分中的行数:

section.multivaluedRowToInsertAt = 索引 如果索引 > 2 让 multiValuedSection = self?.form.sectionBy(tag: "MultivaluedSectionTag") 为!多值部分 multiValuedSection.multivaluedOptions = [.Reorder, .Delete] self?.form.rowBy(tag: "AddButtonProviderTag")?.hidden = true self?.form.rowBy(tag: "AddButtonProviderTag")?.evaluateHidden() // 做其他事情

【讨论】:

是的,这基本上是我尝试过的,但是当一行被删除时你会怎么做?当您这样做时,由于添加按钮行的隐藏,最后一行插入也会出现问题。 遇到了一个看起来很奇怪的错误,在添加第 6 行之前它永远不会隐藏按钮行……你看到了吗? 这是一个不完整的答案,但我授予了赏金,因为它是唯一的另一个,并帮助我制定了接受的答案。

以上是关于Swift Eureka forms:如何限制多值部分中的行数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift Eureka Form 中循环

Swift 4.1 更新后 Eureka Forms 损坏

Eureka Forms Swift 启用和禁用按钮

从 Eureka 表单的多值部分获取表单值

Eureka Forms Multiple Selector Row设置默认值

Swift Eureka 隐藏更改部分