SwiftUI 之 ObservedObject

637 阅读1分钟

@ObservedObject 修饰一个object,也就是修饰一个对象.这个对象可以被其他的类使用.但是这个类首先要遵循ObervableObject协议,并且内部变量使用**@Published** 来修饰.

声明一个ObservedObject

import Foundation
//:需要引入这个类
import Combine

final class PodcastPlayer: ObservableObject {
    @Published private(set) var isPlaying: Bool = false
    func play()  {
        isPlaying = true
    }
    func pause()  {
        isPlaying = false
    }
}

上述代码,声明一个player来.该类的isPlaying 属性不能被外部修改.只能通过 两方法来修改.

下面我们来使用这个类:

创建一个View
struct ProductView: View {
    @ObservedObject var player: PodcastPlayer
    var body: some View {
        Button (action: {
            if player.isPlaying {
                player.pause()
            }else {
                player.play()
            }
            
        }) {
            let buttonTitle = player.isPlaying ? "哈哈哈" : "啦啦啦啦"
            Text(buttonTitle)
        }
    }
}

@ObservedObject var player: PodcastPlayer 在当前类使用player的声明.并且需要在使用的ProductView的地方传入一个默认的player,不然会报错,如下:

struct ContentView: View {
   
    @StateObject private var modelData = ModelData()
    var body: some View {
        ProductView(player: PodcastPlayer()) 
    }
}

这个时候我们运行代码:点击按钮会发现按钮的标题在改变.我们调用player.play 和 pause 方法 来改变 isPlaying的值.相应引用的位置的UI也进行了刷新