Swift - 如何从视图之外的 func 访问@Published var?
Posted
技术标签:
【中文标题】Swift - 如何从视图之外的 func 访问@Published var?【英文标题】:Swift - How to access @Published var from func outside of view? 【发布时间】: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)
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于Swift - 如何从视图之外的 func 访问@Published var?的主要内容,如果未能解决你的问题,请参考以下文章