无法将新参数传递给“NSView”的“init”

Jor*_*lva 4 xcode swift swiftui

在下面的代码中,我尝试将附加参数传递给VidePlayerView. 现在,我正在创建 的一个实例,VideoPlayerView并且没有向它传递任何参数。然而,这最终会调用init带有参数的方法NSRect(我真的不知道它来自哪里)。

我想传递一个额外的参数VideoPlayerView,但我不知道如何做到这一点,因为我似乎无权访问该frame参数。

import SwiftUI
import AVKit

// Note: I couldn't find a way to pass this through the `init` method
var playerLayer = AVCaptureVideoPreviewLayer()

final class VideoPlayerView: NSView {

    // MARK: - Initializers
    override public init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        commonInit()
    }

    required public init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        commonInit()
    }

    private func commonInit() {
        // Do something with playerLayer
    }
}

public struct VideoPlayerViewView: NSViewRepresentable {

    init(layer: AVCaptureVideoPreviewLayer?) {
        if let layer = layer {
            playerLayer = layer
        } else {
            print("No Layer Set")
        }

    }

    public func makeNSView(context: NSViewRepresentableContext<VideoPlayerViewView>) -> NSView {
        return VideoPlayerView()
    }
}

Run Code Online (Sandbox Code Playgroud)

目前,我正在通过忽略frame争论来解决这个问题,但不确定这是否重要。

final class VideoPlayerView: NSView {

    private var playerLayer = AVCaptureVideoPreviewLayer()
    private let rootLayer = CALayer()

    // MARK: - Initializers
    override public init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        commonInit()
    }

    public init(layer: AVCaptureVideoPreviewLayer) {
        self.playerLayer = layer
        super.init(frame: NSRect())
        commonInit()
    }
...
 public func makeNSView(context: NSViewRepresentableContext<VideoPlayerViewView>) -> NSView {
        return VideoPlayerView(layer: self.playerLayer)
    }
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 5

这是可能的方法。使用 Xcode 11.4 进行测试

final class VideoPlayerView: NSView {
    private var playerLayer: AVCaptureVideoPreviewLayer?

    // MARK: - Initializers
    override public init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        commonInit()
    }

    public convenience init(frame frameRect: NSRect = .zero, layer: AVCaptureVideoPreviewLayer?) {
        self.init(frame: frameRect)
        self.playerLayer = layer
    }

    required public init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        commonInit()
    }

    private func commonInit() {
        // Do something with playerLayer
    }
}

public struct VideoPlayerViewView: NSViewRepresentable {

    init(layer: AVCaptureVideoPreviewLayer?) {
        if let layer = layer {
            playerLayer = layer
        } else {
            print("No Layer Set")
        }

    }

    public func makeNSView(context: NSViewRepresentableContext<VideoPlayerViewView>) -> NSView {
        return VideoPlayerView(layer: playerLayer)
    }

    public func updateNSView(_ nsView: NSView, context: Context) {
    }
}
Run Code Online (Sandbox Code Playgroud)