这是我声明的两个属性
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
}
}
}