我是Swift的新手,我正在努力使我的项目更加面向对象。
我正在为使用大疆SDK制作应用程序,当复合类中的一些变量改变时,我试图改变视图中的一些东西。
所以我有:AppController中的代码:
@main
struct AppController: App {
@State var djiService = ProductCommunicationService()
var body: some Scene {
WindowGroup {
InfoFormView(djiService: $djiService, rcEngineConn: $rcEngineConn, bridgeStatus: $bridgeStatus, fpvMode: $fpvMode, libMode: $libMode)
}
}
在ProductCommunicationService中,变量和逻辑很少
class ProductCommunicationService: NSObject {
@Published var registered = false
@Published var connected = false
@Published var enableBridgeMode = false
@Published var bridgeAppIP = "0.0.0.0"
func registerWithSDK() {
.....
我尝试做的是,当ProductCom..类中的som变量更改时,刷新下面的视图
struct InfoFormView: View {
@Binding var djiService : ProductCommunicationService
@Binding var rcEngineConn : Bool
@Binding var bridgeStatus : Bool
@Binding var fpvMode : Bool
@Binding var libMode : Bool
var body: some View {
HStack(alignment: .top){
VStack(alignment: .leading, spacing: 20) {
Text("CR Fly Beta").font(.title).bold()
Text("Connected to aircraft: " + (self.djiService.connected ? "Yes": "No")).font(.title)
Text("Connected to RC: " + (self.rcEngineConn ? "Yes": "No")).font(.title)
Text("Bridge Mode Status: " + (self.djiService.enableBridgeMode ? "On" : "Off")).font(.title)
HStack(){
if(self.djiService.connected){
Button("Lets FLY!"){
self.fpvMode = true
}.buttonStyle(.bordered).font(.title2)
Button("Photo Library"){
self.libMode = true
}.buttonStyle(.bordered).font(.title2)
}
}
有没有办法在变量更改时刷新它?我尝试了所有方法,还创建了带有插入变量的ProductComService(由于@State而不起作用)
1条答案
按热度按时间igsr9ssn1#
所以我想明白了。
我用ObservableObject的实现创建了一个新的数据对象myObject。
此对象仅包含带有@Pubslished的变量。
然后在appController中,我存储了@ObservableObject myObject = myObject()
并将其连接到视图和产品通信服务。
在初始化对象时不要忘记o @Published和@ObservableObject