导入 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
这样编译:
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