Обновление значений Swift Eureka SplitRow - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь обновить значения каждого LabelRow в моем SplitRow каждый раз, когда V C появляется на экране (это должно быть так). Я пробовал использовать .cellUpdate для обоих LabelRows, но он просто вылетает. Когда я использую .updateCell только для одной из LabelRows, он прекрасно обновляет значение этой строки. Есть ли способ обновить их оба одновременно? Я попытался использовать .updateCell в SplitRow, но не могу обновить значения (они доступны только для чтения?). Неудачная часть кода:

            <<< SplitRow<LabelRow, LabelRow>() {
            $0.rowLeftPercentage = 0.5
            $0.rowLeft = LabelRow() {
                $0.title = "Expected"
                $0.tag = "temp_expected"
            } //tried callbacks here

            $0.rowRight = LabelRow() {
                $0.title = "Last"
                $0.tag = "temp_last"
            } //tried callbacks
        } //also tried there but cant update values

EDIT: вот что я пробовал

            <<< SplitRow<LabelRow, LabelRow>() {
            $0.rowLeftPercentage = 0.5
            $0.rowLeft = LabelRow() {
                $0.title = "Expected"
                $0.tag = "temp_expected"
            }.cellUpdate {
                $1.value = "value1" //here would go value from other object, doesn't work either
            }
            $0.rowRight = LabelRow() {
                $0.title = "Last"
                $0.tag = "temp_last"
            } .cellUpdate {
                $1.value = "value2" // same as above
            }
        } 

И еще один

            <<< SplitRow<LabelRow, LabelRow>() {
            $0.rowLeftPercentage = 0.5
            $0.rowLeft = LabelRow() {
                $0.title = "Expected"
                $0.tag = "temp_expected"
            }
            $0.rowRight = LabelRow() {
                $0.title = "Last"
                $0.tag = "temp_last"
            }
        }.cellUpdate {
            $1.value?.left = "value1" //does nothing
            $1.value?.right = "value2" //does nothing
        }

1 Ответ

1 голос
/ 25 мая 2020

Ваш код вылетает из-за переполнения стека. Установщик $1.value вызывает cell.update(), который вызывает cellUpdate, который формирует бесконечное l oop: (

Я нашел этот грязный трюк такого рода работает :

Оберните строку row.value = ... в вызов DispatchQueue.main.async:

SplitRow<LabelRow, LabelRow>() {
    $0.rowLeftPercentage = 0.5
    $0.rowLeft = LabelRow() {
        $0.title = "A"
        $0.tag = "temp_expected"
    }.cellUpdate { cell, row in
        DispatchQueue.main.async {
            row.value = ...
        }
    }
    $0.rowRight = LabelRow() {
        $0.title = "B"
        $0.tag = "temp_last"
    } .cellUpdate { cell, row in
        DispatchQueue.main.async {
            row.value = ...
        }
    }
}

На самом деле вы должны найти другое место для установки значения вашей строки. Похоже, что значение меняется с течением времени, и вы хотите всегда показывать последнее значение. Попробуйте использовать реактивный подход, используя RxSwift . Вы бы подписались на Observable<String> и устанавливали каждое полученное значение равным значению строки.

...