swift 从ViewModel更改导航堆栈路径?

m2xkgtsf  于 8个月前  发布在  Swift
关注(0)|答案(1)|浏览(58)

我试图在我的小应用程序中实现MVVM架构,我对如何从ViewModel更新我的NavigationStackpath感到困惑。我的path是一个@Published属性,并通过@EnvironmentObject插入到我的View中。通过一个按钮,我正在使用ViewModel中的相应函数进行API调用。如果API调用成功,我想更改NavigationStack的path。但我无法访问ViewModel中的@Published属性!我可以使用完成处理程序,但这不是干净的MVVM,对吗?

型号:

enum pathCases:  Hashable {
    case Home, Settings
}

class Navigation: ObservableObject {
    @Published var path: [pathCases] = []
}

字符串

查看:

//...
@EnvironmentObject var navigation: Navigation
//...
NavigationStack(path: $navigation.path) {
   //...
   Button("Make API-Call") {
       myApiFunction()
   }
   //...
}

ViewModel:

@MainActor final class ViewModel: ObservableObject {
    func myApiFunction() {
       //change the array navigation.path - how?
    }
}

qoefvg9y

qoefvg9y1#

在视图模型中可以有一个@Published变量,视图可以监听它,并且可以使用.onChange观察器将路径附加到导航环境对象中

查看:

//...
@EnvironmentObject var navigation: Navigation
//...
NavigationStack(path: $navigation.path) {
   //...
   Button("Make API-Call") {
       myApiFunction()
   }
   //...
}.onChange(of: viewModel.resultOfApi) { resultOfApi in
        if resultOfApi {
            // append to navigation.path here
        }
    }

字符串

ViewModel

@MainActor final class ViewModel: ObservableObject {
    @Published resultOfApi = false // for example
    func myApiFunction() {
       resultOfApi = true
    }
}


重要的是要理解新的API是“数据驱动的”,因此您的更改应该修改某些数据容器的状态(这里是您的ViewModel,View只是根据数据的状态对其做出React)。

相关问题