Получить значения формы из многозначных разделов формы Eureka

Задавая этот вопрос здесь, потому что это еще не было описано в документах, и они отслеживают и отвечают на этот тег. Я использую Eureka для создания многозначной формы. Это мой код:

    +++ MultivaluedSection(multivaluedOptions: [.Reorder, .Insert, .Delete],
        header: "Options",
        footer: "footer") {
                            $0.addButtonProvider = { section in
                                return ButtonRow(){
                                    $0.title = "Add New Option"
                                }
                            }
                            $0.multivaluedRowToInsertAt = { index in
                                print(self.form.values())
                                return NameRow() {
                                    $0.placeholder = "Your option"
                                }
                            }
                            $0 <<< NameRow() {
                                $0.placeholder = "Your option"
                            }
    }

Теперь я хочу извлечь все значения в NameRows в конце. Может быть любое количество строк (в зависимости от ввода пользователя). Вот что я пробовал:

self.form.values(), но получается [ : ].

Как получить все значения?


person sasquatch    schedule 23.04.2017    source источник


Ответы (4)


Для тех, у кого похожая проблема:

form.values() был пуст, потому что строкам не были присвоены теги. Чтобы получить значения из form, дайте теги строкам, и вы получите словарь значений с ключами в качестве этих тегов. Для этого случая

+++ MultivaluedSection(multivaluedOptions: [.Reorder, .Insert, .Delete],
                           header: "header",
                           footer: "footer") {
                            $0.addButtonProvider = { section in
                                return ButtonRow(){
                                    $0.title = "Button Title"
                                }
                            }
                            $0.multivaluedRowToInsertAt = { index in
                                return NameRow("tag_\(index+1)") {
                                    $0.placeholder = "Your option"
                                }
                            }
                            $0 <<< NameRow("tag_1") {
                                $0.placeholder = "Your option"
                            }
    }

Теперь значения будут возвращены как ["tag_1" : "value 1", "tag 2 : "value 2" ....] для любого количества строк, вставленных пользователем.
P.S.: Использован тег index in, поскольку повторяющиеся теги не допускаются, а значение index отличается для разных строк.

person sasquatch    schedule 26.04.2017

Это гораздо более простой способ

Прежде всего, добавьте тег ко всему объекту MultivalueSection.

    +++ MultivaluedSection(multivaluedOptions: [.Reorder, .Insert, .Delete],
    header: "Options",
    footer: "footer") {

                        $0.tag = "someTag" // added this line

                        $0.addButtonProvider = { section in
                            return ButtonRow(){
                                $0.title = "Add New Option"
                            }
                        }
                        $0.multivaluedRowToInsertAt = { index in
                            print(self.form.values())
                            return NameRow() {
                                $0.placeholder = "Your option"
                            }
                        }
                        $0 <<< NameRow() {
                            $0.placeholder = "Your option"
                        }
}

а затем вы можете получить значения с помощью

let values = (self.form.values()["someTag"]!! as! [Any?]).compactMap { $0 }
person Hatim    schedule 23.01.2019

form.values() возвращает Dictionary, а Dictionary не содержит информации о порядке.
Таким образом, вы не можете получить переупорядоченные значения из form.values().

Я получил упорядоченные данные, как показано ниже:
(form.allRows возвращает массив, и у него есть информация о заказе.)

// Dictionary doen't have order info.
let values: Dictionary = form.values()
NSLog("LogA : %@", values)

// Array has order info, and this can return all tags.
let allRow: Array<BaseRow> = form.allRows
for i in 0..<allRow.count {
    let tmp: BaseRow = allRow[i]
    NSLog("LogB : %d : %@", i, tmp.tag ?? "")
}

// So make ordered data by from.values() and form.allRows like this.
var results: Array = [String]()
for i in 0..<allRow.count {
    let tag: String = allRow[i].tag ?? ""
    if(tag != ""){
        let val: String = values[tag] as! String
        results.append(tag + ":" + val)
    }
}
NSLog("LogC = %@", results)

Спасибо

person shinya    schedule 26.06.2017

Как описано здесь, просто укажите тег для каждой строки;

<<< NameRow() {
$0.tag = "NameRow"
$0.title = "Name:"
$0.value = "My name" }
person Ammar Mujeeb    schedule 29.09.2017
comment
То же самое описано в ответе выше - person sasquatch; 02.10.2017