【问题标题】:How to get notified in SwiftUI when UIKit UIViewController viewDidLoad finishedUIKit UIViewController viewDidLoad完成时如何在SwiftUI中获得通知
【发布时间】:2020-07-11 13:19:54
【问题描述】:

我有一个UIViewControllerSwiftUI 中使用以下代码正常工作。

import Foundation
import SwiftUI

final class RTCVideoViewController: UIViewController {
  
  var previewView: RTCEAGLVideoView!
  var videoTrack: RTCVideoTrack!
  
  override func viewDidLoad() {
    
    previewView = RTCEAGLVideoView(frame: CGRect(x:0, y:0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
    previewView.contentMode = UIView.ContentMode.scaleAspectFit
    view.addSubview(previewView)
    
    do {
      videoTrack = try MediaCapturer.shared.createVideoTrack(videoView: previewView)
    } catch {
      print(error)
    }
  }
}

extension RTCVideoViewController : UIViewControllerRepresentable{
  public typealias UIViewControllerType = RTCVideoViewController
  
  public func makeUIViewController(context: UIViewControllerRepresentableContext<RTCVideoViewController>) -> RTCVideoViewController {
    return RTCVideoViewController()
  }
  
  public func updateUIViewController(_ uiViewController: RTCVideoViewController, context: UIViewControllerRepresentableContext<RTCVideoViewController>) {
  }
}

在 SwiftUI 视图中。

import Combine
import SwiftUI

struct LiveView: View {
  
  @ObservedObject var viewModel: LiveViewModel
  
  init(viewModel: LiveViewModel) {
    self.viewModel = viewModel
  }
  
  var body: some View {
    return ZStack {
      RTCVideoViewController()
        .edgesIgnoringSafeArea(.top)
    }
  }
}

到目前为止一切正常,但我需要在创建时将 RTCVideoTrack 传递给 LiveViewModel

知道当 viewDidLoad 完成或 RTCVideoTrack 传递给 LiveViewModel 时我可以实施什么模式来获得通知吗?

【问题讨论】:

    标签: ios swift mvvm uikit


    【解决方案1】:

    我对代码做了一些改动,它很接近但更简化了。

    import Foundation
    import SwiftUI
    
    struct RTCVideoViewController : UIViewControllerRepresentable {
      var viewModel: LiveViewModel
    
      
      func makeUIViewController(context: Context) -> UIViewController {
          UIViewController()
      }
      
      func updateUIViewController(_ viewController: UIViewController, context: Context) {
        print("HostBroadcastViewController:updateUIViewController")
        let previewView = RTCEAGLVideoView(frame: CGRect(x:0, y:0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
        previewView.contentMode = UIView.ContentMode.scaleAspectFit
        viewController.view.addSubview(previewView)
        
        do {
          let videoTrack = try MediaCapturer.shared.createVideoTrack(videoView: previewView)
          self.viewModel.videoTrack = videoTrack
        }
        catch {
          print("ERROR getting RTCVideoTrack")
        }
      }
    }
    

    在 SwiftUI 中,使用 RTCVideoViewController(viewModel: self.viewModel) 初始化 RTCVideoViewController,其中 ViewModel 从父视图传入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多