如何针对ObservableObject触发@State对象



这是我声明的两个属性

struct DashBoardView: View {
@State var isToPush: Bool = false
@ObservedObject var sideBarHandler = SideBarHandler()

SideBarHandler所在位置-

class SideBarHandler: ObservableObject {
@Published var isListItemClicked:Bool = false
}

现在我想激活基于sideBarHandler.isListItemClicked$isToPush

因为我想把它绑定在这里

NavigationLink(destination: FavouriteView(), isActive: $isToPush) {// NavLink

您必须考虑数据的真实性来源。

根据您的描述,isListItemClicked似乎是真相的来源,所以您甚至不需要@State变量-直接使用$sideBarHandler.isListItemClicked(@ObservedObject的前缀$Binding(:

NavigationLink(destination: FavouriteView(), isActive: $sideBarHandler.isListItemClicked)

当然,如果@State var isToPush: Bool只受sideBarHandler.isListItemClicked的影响,但在其他方面独立存在,即它是该数据的真实来源,那么您可以按照@Asperi的建议使用onReceive来更改isToPush属性:

.onReceive(sideBarHandler.$isListItemClicked) { 
isToPush = $0 
}

(注意这里的$前缀访问@Published联合发布器(


此外,与您的问题无关,但如果您在视图中实例化ObservableObject,则应使用@StateObject而不是@ObservedObject。后者适用于在视图之外创建可观察对象的情况。

您可以在body中的某个位置使用onReceive,如

struct DashBoardView: View {
@State var isToPush: Bool = false
@ObservedObject var sideBarHandler = SideBarHandler()
var body: some View {
VStack {
// some content here
}
.onReceive(sideBarHandler.$isListItemClicked) {
isToPush = $0
}
}
}

最新更新