Вы можете явно определить поле и ссылку на поле с помощью аргумента name
:
class BooksListFilter(df.FilterSet):
new_name = df.CharFilter(name='name')
class Meta:
model = Books
fields = ['new_name']
Сообщение об ошибке как бы подсказывает вам одно решение: внедрите init(layer:)
в CPCoursePointLayer
.
Когда вы устанавливаете свойство для слоя, и этот слой находится в дереве слоев не скрытого окна, Core Animation ищет CAAction
для этого свойства, отправляя сообщение actionForKey:
к слою. Если этот поиск возвращает nil
, Core Animation создает неявную анимацию для свойства, используя некоторые параметры по умолчанию.
Любой слой с прикрепленной анимацией имеет соответствующий уровень представления. (Прочитайте Деревья слоев отражают различные аспекты состояния анимации для получения дополнительной информации.) Поэтому Core Animation необходимо создать соответствующий слой представления для вашего hitLayer
. Это делается с помощью инициализатора init(layer:)
в вашем классе CPCoursePointLayer
.
В Swift класс не наследует автоматически все конструкторы своего суперкласса, поэтому ваш класс CPCoursePointLayer
не имеет этого инициализатора. Итак, ваше приложение вылетает.
Одним из решений является добавление инициализатора init(layer:)
в ваш класс CPCoursePointLayer
:
init(layer: CALayer) {
let layer = layer as! CPCoursePointLayer
// copy any custom properties from layer to self here
super.init(layer: layer)
}
Если вы определите init(layer:)
, то вы можете анимировать свойства вашего слоя и позволить им быть неявно анимированный.
Если вы никогда не планируете явно или неявно анимировать свойства вашего слоя, вы можете вместо этого отключить неявную анимацию, возвращая NSNull
, когда Core Animation ищет действие, например, добавив этот метод в ваш класс CPCoursePointLayer
:
override class func defaultAction(forKey key: String) -> CAAction? {
return unsafeBitCast(NSNull(), to: CAAction?.self)
}