首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SwiftUI中将数据从模型传递到视图

在SwiftUI中将数据从模型传递到视图
EN

Stack Overflow用户
提问于 2021-02-17 06:27:41
回答 1查看 87关注 0票数 0
  • 如何在从CameraView.

中的一个按钮填充videoClips数组之后从CameraService获取数据

我希望能够按下一个按钮并移动到一个新的屏幕上,通过一个AVPlayerItems.数组传递。

即使我知道CameraService中的数组中有数据,

  • 按钮也总是打印0。

代码语言:javascript
运行
复制
public class CameraService: NSObject, AVCaptureFileOutputRecordingDelegate {
     
  @Published public var videoClips = [AVPlayerItem]()

  public func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
    let video: AVPlayerItem = AVPlayerItem(url:outputFileURL)
    videoClips.append(video)
  }
}

final class CameraModel: ObservableObject {
    
  private let service = CameraService()
  var videoClips: [AVPlayerItem]

  init() {   
    videoClips = service.videoClips
  }
}

struct CameraView: View {
    
  @StateObject var model = CameraModel()

  var body: some View {
    Button("video") {
      print(model.videoClips.count)
    }
  }
}
EN

回答 1

Stack Overflow用户

发布于 2021-02-17 07:19:47

在其当前形式中,model.videoClips.count将永远只为0,因为您在init()中设置了videoClips,然后就再也不会更新它了。

我猜您假设它将被更新,因为CameraService.videoClips是一个@Published属性。但是,@Published只能由View和它们的ObservableObject自动监视。因此,这里有两个问题:( a) CameraService不是ObservableObjectCameraModel不是View

我的第一个建议是完全抛弃CameraModel。也许这是一个尽量少的例子的函数,但在它目前的形式中,它没有做任何事情--它只是一个没有功能的中间人。因此,将CameraService转换为一个ObservableObject,这意味着@Published属性将正常工作,您就可以继续工作了。

关于另一个屏幕的导航,这可能是另一个问题的最佳选择,但我将在这里留下一个简短的答案:

代码语言:javascript
运行
复制
//in your view
NavigationLink(destination: DetailView(videoClips: service.videoClips)) {
  Text("Link")
} 

(这是假设您已经将CameraService转换为ObservableObject)

如果出于某种原因,您确实需要CameraModelCameraService,您可以通过这样的操作将两者连接起来:

代码语言:javascript
运行
复制
class CameraModel : ObservableObject {
    private let service = CameraService()
    @Published var videoClips : [AVPlayerItem] = [] //note that this is @Published now
        
    init() {
        service.$videoClips.assign(to: &self.$videoClips) //use a Combine Publisher to get updates from the CameraService videoClips and assign them to this class's videoClips any time there's an update 
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66236747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档