Как согласовать NSView с CALayerDelegate при импорте SwiftUI? - PullRequest
3 голосов
/ 19 октября 2019

Компилируется:

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, методы делегата не вызываются.

1 Ответ

5 голосов
/ 19 октября 2019

Они не вызваны, потому что компилятор не может видеть, что они реализуют протокол, и, следовательно, не сделает их доступными из Objective-C. Но вы все равно можете сделать его доступным вручную с атрибутом @objc. Вам также следует указать имя селектора Objective-C, которое не всегда совпадает с именем в Swift:

import AppKit
import SwiftUI

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