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

问题描述 投票:11回答:2

我正在使用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,但是我无法弄清楚如何让它在删除一行后返回允许插入。

还尝试基于与上面类似的方法(具有最大行)对ButtonRow的禁用属性设置条件但是它也遇到重复的行标记问题并且绿色添加按钮仍然响应点击,并且showInsertIconInAddButton属性没有效果。

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

ios swift eureka-forms
2个回答
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()
        }
    }
}

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
}

© www.soinside.com 2019 - 2024. All rights reserved.