从多重选择器行检索值时遇到问题

时间:2019-03-19 02:03:23

标签: swift swift4.2 eureka-forms

我一直试图解决这一问题,但一直没有成功。我想做的是从多个选择器行中检索选定的值。到目前为止,该行已完全正常运行,并且我已经能够对其进行设置,以使我的选项成为结构。

当我需要从表单中检索数据时,我遇到的问题已经接近尾声。我能够使用form.values()并在很大程度上了解如何使用字典。

当我在多行中调用值时,它们作为“集合”出现。我对Swift还是比较陌生,所以我以前从未处理过这些,但是到目前为止,我所读到的是像数组这样的集合类型?

这是给我一些问题的部分:

//
        <<< ButtonRow("btnnRow") { row in
            row.title = "Confirm selection."
            row.onCellSelection({ (cell, row) in
                let formValues = self.form.values()
                let koko = formValues["multiSelectTest"] as! Set<MultiTestStruct>
                switch koko.isEmpty {
                case true:
                    print("Set is empty")
                case false:
                    print("Set is NOT empty!")
                }
            })
    }

这是我尝试过的最新版本。它可以在第一次加载时打印“空”,但是一旦我选择一个选项并再次取消选择它,就会崩溃!

我认为选择后出现问题,因为当我打印所有值时,它最初是"multiSelectTest": nil,但是在“多行”中进行选择然后取消选择之后,它变成了:{{ 1}}。

很抱歉,如果这没有道理,我很乐意在需要时进一步解释,现在是凌晨2点,我的大脑非常疲惫!

TL:DR-如何从多个选择行中获取值。

感谢您阅读。

更新:错误消息-"multiSelectTest": Optional(Set([]))-如果在选择和取消选择之前尝试获取行值,则会收到此错误。切换选择后,就没有问题了。

这是进行选择之前所有值的控制台输出:

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

这是选择选项后的控制台输出:

["btnRow": nil, "btnRow2": nil, "multiSelectTest": nil]

最后,这是在我清除了所有选项的多行之后:

["btnRow": nil, "btnRow2": nil, "multiSelectTest": Optional(Set([theDD_Admin.MultiTestStruct(name: "HELLO!")]))]

我的主要行动计划是,如果multi为["btnRow": nil, "btnRow2": nil, "multiSelectTest": Optional(Set([]))] ,则要求使用多行值,但是如您所见,它只有零,而未被触及。在取消选择某个选项后,它变成了一个集合,我从那里迷路了。

谢谢

1 个答案:

答案 0 :(得分:0)

根据@koropok的评论,这是我设法提出的。在多行中,我设置了 public async Task publishMessagesPubSub(string message) { try { PublisherServiceApiClient publisherService = await PublisherServiceApiClient.CreateAsync(); TopicName topicName = new TopicName(ProjectId, TopicId); PublisherClient publisher = await PublisherClient.CreateAsync(topicName); //Dictionary<string, object> frameFormatted; WriteBatch batch = db.StartBatch(); DateTime pEnqueuedTimeUtc = new DateTime(); var records = <...>; if (records != null && records.Length > 0) { var orderedRecords = records.ToArray(); string[] records2 = JSONFormatter.FormatToJson(orderedRecords); //foreach (string record in records2) Parallel.ForEach(records2, async record => { await Task.Run(() => publisher.PublishAsync(record)); await Task.Run(() => StorageMessagesInFireStoreDocumentBatch(JSONtoDict(record), document, batch)); } ); } } catch (Exception exc) { WriteLogEntry("publishMessagesPubSub: Message:" + exc.Message); } } private async Task StorageMessagesInFireStoreDocumentBatch(Dictionary<string, object> data, DocumentReference document, WriteBatch batch) { try { batch.Set(document, data); var future= await batch.CommitAsync(); Debug.WriteLine("future.Count(): Message:" + future.Count()); } catch (Exception exc) { Debug.WriteLine("StorageMessagesInFireStoreDocumentBatch: Message:" + exc.Message); //WriteLogEntry("StorageMessagesInFireStoreDocumentBatch: Message:" + exc.Message); } } 行为-

.onChange

我尝试执行row.onChange({ (row) in if row.value?.isEmpty == true { // if row Set<> is empty then this row will be cleared and set to nil self.form.setValues(["multiSelectTest" : nil]) } }) 时遇到错误,并且这种方式按预期工作。

这是我想出的,到目前为止对我来说效果很好。对于那些比我有更多经验的人,这是正确/最好的方法吗?想知道是否有人会做不同的事情。

再次感谢!