【问题标题】:Swift - How to access @Published var from func outside of view?Swift - 如何从视图之外的 func 访问@Published var?
【发布时间】:2019-12-28 14:25:16
【问题描述】:

我试图从视图中删除逻辑,同时保留 SwiftUI 的优点。想法 1 有效,但它使用的变量比我想要的要多。想法 2 给出错误:本地属性尚不支持属性包装器。视图应该返回“bar”。完成这项工作的最佳方法是什么?非常感谢。

import Combine
import Foundation
import SwiftUI

// Model

enum Model: String, RawRepresentable {

    case foo = "foo"
    case bar = "bar"
}

// State

var data1: String = Model.foo.rawValue

class State: ObservableObject {

    @Published internal var data2: String = data1
}

// Logic

func logic() {

// Idea 1: OK

    //data1 = Model.bar.rawValue
    //print(State().data2)

// Idea 2: Error Property wrappers are not yet supported on local properties

    @EnvironmentObject private var state: State
    state.data2 = Model.bar.rawValue
    print(state.data2)
}

// View

struct bar: View {

    @EnvironmentObject private var state: State

    internal var body: some View {

        logic()
        return Text(verbatim: self.state.data2)
    }
}

【问题讨论】:

    标签: swift swiftui combine property-wrapper


    【解决方案1】:

    如果您希望函数能够访问视图的状态,请传递状态:

    func logic(state: State) {
        state.data2 = Model.bar.rawValue
        print(state.data2)
    }
    

    但是你在这里所做的是一个无限循环。修改视图的状态会导致视图被重新渲染。所以每次渲染视图时,它都会修改其状态并强制再次渲染。那永远解决不了。您在这里可能的意思是更改视图首次出现时的状态,在这种情况下您可以这样调用logic

    struct Bar: View {
    
        @EnvironmentObject private var state: State
    
        internal var body: some View {
            Text(verbatim: state.data2)
                .onAppear{ logic(state: self.state) }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多