我一直试图解决这一问题,但一直没有成功。我想做的是从多个选择器行中检索选定的值。到目前为止,该行已完全正常运行,并且我已经能够对其进行设置,以使我的选项成为结构。
当我需要从表单中检索数据时,我遇到的问题已经接近尾声。我能够使用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([]))]
,则要求使用多行值,但是如您所见,它只有零,而未被触及。在取消选择某个选项后,它变成了一个集合,我从那里迷路了。
谢谢
答案 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])
}
})
时遇到错误,并且这种方式按预期工作。
这是我想出的,到目前为止对我来说效果很好。对于那些比我有更多经验的人,这是正确/最好的方法吗?想知道是否有人会做不同的事情。
再次感谢!