WedX - журнал о программировании и компьютерных науках

Метод запуска SwiftUI в представлении при изменении значения элемента опубликованной модели представления

У меня проблемы с запуском методов просмотра при изменении значения опубликованного свойства. Мой пример кода игровой площадки выглядит так:

class MyFoo: ObservableObject {
    @Published var bar: String
    init(bar: String) {
        self.bar = bar
    }

    func setNewText(newString: String) {
        self.bar = newString
    }

    func runFunctions() {
        setNewText(newString: "Test")
    }
}

struct TestView: View {
    @ObservedObject let foo = MyFoo(bar: "bar0")

    init(){
        let barSink = foo.$bar
            .sink() { //THIS IS WHERE I GET ERROR "Escaping closure captures mutating 'self' parameter"
                self.printResult(result: $0)
            }
    }

    func printResult(result: String) {
        print(result)
    }
}

let a = TestView()

В основном я знаю, почему я получаю эту ошибку при закрытии, но не знаю, как ее обойти. Это правильный подход для запуска методов просмотра на измененном значении опубликованного свойства виртуальной машины?

Мне это нужно, потому что я использую настраиваемый счетчик, который не готов к SwiftUI, поэтому я не могу привязаться к нему, и единственный способ показать / скрыть его - вызвать его методы.

Любая помощь будет очень признательна


  • попробуйте добавить @ObservedObject перед let foo = MyFoo(bar: "bar0") и сделать MyFoo наследовать от ObservableObject: class MyFoo: ObservableObject {} 21.11.2019
  • Я отредактировал вопрос, но это не исправляет ошибку 21.11.2019

Ответы:


1

Не знаю, как устроена детская площадка, но постараюсь ответить на ваш вопрос. Я протестировал код в симуляторе и на реальном устройстве:


class MyFoo: ObservableObject {
    @Published var bar: String
    init(bar: String) {
        self.bar = bar
    }

    func setNewText(newString: String) {
        self.bar = newString
    }

    func runFunctions() {
        setNewText(newString: "Test")
    }


}

struct TestView: View {
    @ObservedObject var foo = MyFoo(bar: "bar0")

    var body: some View {
        Text("Lolz")
            .onReceive(self.foo.$bar, perform: { lolz in
                self.printResult(result: lolz)
            })
    }

    func printResult(result: String) {
        print(result)
    }

}

struct ContentView: View {
    var body: some View {
        TestView()
    }
}

@ObservedObject должен быть var. С onRecieve() вы можете слушать издателя и обновлять пользовательский интерфейс или вызывать функцию.

Надеюсь, это поможет.

21.11.2019
  • Большое спасибо, не знаю, является ли это официальным решением Apple, но оно работает как шарм !!! 21.11.2019
  • Ну onReceive() создан специально для того, чтобы слушать издателя! :) 21.11.2019
  • Да, я знаю, я имел в виду добавление текстового блока, который никогда не будет использоваться как текстовый блок. Было бы неплохо создать собственный элемент управления, скажем, ActionBinder или что-то в этом роде. ActionBinder () .onReceive (self.foo. $ Bar, выполнить: {p в self.runSomeAction (param: p)}) 22.11.2019
  • Вы можете просто создать собственный View struct customView: View { var body: some View { Text("").onRecieve() }}, и вы даже можете сделать это в родительском и onReceive() на customView 22.11.2019
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]