multivaluedRowToInsertAt

multivaluedRowToInsertAt

我正在使用Eureka使用Swift在iOS中构建表单。我创建了一个多值部分,例如:

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,但是我在弄清楚如何使它返回到允许在删除行后插入时遇到麻烦。

还尝试根据与上述类似的方法(最大行数)对ButtonRow的disable属性设置条件,但它也会遇到重复的行标签问题,绿色的添加按钮仍会响应点击,而showInsertIconInAddButton属性没有影响。

即使我使用了这种方法,也似乎不必要地费时费力,而且我希望会有一个更简单的解决方案,因为这似乎是很多人需要的功能。

最佳答案

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中的按钮行的更改似乎没有生效,无论何时调用隐藏方法以及将最大计数设置为什么,插入的最后一行进入倒数第二行地方。因此,我尝试了上面编写的代码,并通过调度调用延迟了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()
        }
    }
}

10-01 07:45