Невозможно передать новый аргумент `init` для` NSView` - PullRequest
3 голосов
/ 10 апреля 2020

В следующем коде я пытаюсь передать дополнительный аргумент 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()
    }
}

В настоящее время я решаю эту проблему, игнорируя аргумент 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)
    }

1 Ответ

3 голосов
/ 10 апреля 2020

Здесь возможен подход. Протестировано с 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) {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...