导入 SwiftUI 时如何让 NSView 符合 CALayerDelegate?

How to conform NSView to CALayerDelegate when you import SwiftUI?

这样编译:

import AppKit

class CustomView: NSView, CALayerDelegate {
    func layoutSublayers(of layer: CALayer) {}
}

但这不是:

import AppKit
import SwiftUI

class CustomView: NSView, CALayerDelegate {
    func layoutSublayers(of layer: CALayer) {}
}

这是一个错误:

... error: redundant conformance of 'CustomView' to protocol 'CALayerDelegate'
class CustomView: NSView, CALayerDelegate {}
                          ^
... note: 'CustomView' inherits conformance to protocol 'CALayerDelegate' from superclass here
class CustomView: NSView, CALayerDelegate {}
      ^

知道如何解决这个问题吗?

如果删除 CALayerDelegate 一致性,则不会调用委托方法。

它们没有被调用,因为编译器看不到它们正在实现协议,因此不会使它们在 Objective-C 中可用。但是您仍然可以使用 @objc 属性手动使其可用。您还应该指定 Objective-C 选择器名称,该名称并不总是与 Swift:

中的名称相同
import AppKit
import SwiftUI

class CustomView: NSView {
    @objc(layoutSublayersOfLayer:)
    func layoutSublayers(of layer: CALayer) {}
}

@Michel 的回答对我不起作用,因为我有不同的方法导致了这个问题。

@objc(drawLayer:inContext:)
func draw(_ layer: CALayer, in ctx: CGContext)
{}

一般的解决方案仍然是检查在自定义 Swift 文件中实现的 Objective-C 方法并使用: @objc(methodName)Swift 方法名称上方。

这里是CALayerDelegate的方法列表(5):

Swift -> https://developer.apple.com/documentation/quartzcore/calayerdelegate

Objective-C -> https://developer.apple.com/documentation/quartzcore/calayerdelegate?language=objc