#ios #swift #computed-properties
#iOS #swift #вычисляемые свойства
Вопрос:
Я пытаюсь создать одноэлементный экземпляр UIView в своем коде, поэтому всякий раз, когда я создаю экземпляр «MyView», файл nib загружается только один раз, а затем повторно используется:
class MyView : UIView {
@IBOutlet weak var someLabel: UILabel!
static var customeView : UIView = {
let view = Bundle.main.loadNibNamed(String(describing: MyView.self), owner: self, options: nil)?[0] as! UIView
return view
}()
convenience init() {
self.init(frame: CGRect(x: 0, y: 0, width: 576, height: 30))
let viewForOnce = MyView.customeView
viewForOnce.frame = bounds
}
}
Проблема в том, что всякий раз, когда я вызываю MyView.customeView
сбой it, говоря, что «этот класс не совместим с кодированием ключевых значений», я думаю, это происходит из-за ‘owner: self’ внутри вычисляемого свойства.
Любая помощь будет оценена.
Комментарии:
1.
this class is not key value coding-compliant
обычно это проблема с построителем интерфейса, которую можно использоватьself
в отложенном инициализированном свойстве2. Я дважды проверяю это особенно, и все подключено! Я дважды проверяю это особенно, и все подключено! но если я поставлю owner: MyView () вместо owner: self, тогда это сработает!
3. Зачем вам на самом деле нужно такое поведение? Почему бы не добавить
ReceiptView
в класс MyView? Кстати, то, что вы делаете, не имеет ничего общего с одноэлементным шаблоном.4. Я имел в виду, что синглтон загружает перо только один раз, когда я создаю и экземпляр этого класса. ReceiptView по ошибке теперь является его MyView.
Ответ №1:
Проблема, скорее всего, в вашем ReceiptView.xib
. Сначала вы должны просмотреть его. Найдите an IBOutlet
, который есть в xib, но не в вашем классе ReceiptView, и удалите его.
Редактировать:
Я имел в виду, что синглтон загружает перо только один раз, когда я создаю и экземпляр этого класса.
-
Нет, это так не сработает. Каждый раз, когда вызывается init , также вызывается ваше вычисляемое свойство, и каждый раз создается новый экземпляр из xib.
-
Как уже упоминал Кариен ван Зил, вы используете
self
вclass
переменной, которая соответствует самомуMyView
классу (или его подклассу, если он вызывается для подкласса), а не экземпляру. Попробуйтеnil
owner
вместо этого передать as . -
Для меня вся техника выглядит неправильно. Вы не должны использовать одноэлементный шаблон с
UIView
подклассами. Нет ничего плохого в том, чтобы вызыватьloadNibNamed
несколько раз и создавать точно такие же экземпляры. Если вы хотите использовать один и тот же экземпляр несколько раз в иерархии представлений, это невозможно, поскольку каждое представление может иметь только один супервизор. В этом случае вы должны следовать шаблону MVC: создайте несколькоMyView
экземпляров -> обновляйте модель всякий раз, когда вы что-то меняете в представлении и хотите, чтобы эти изменения были отражены в другом месте -> обновите другое представление, используя обновленную модель.
Комментарии:
1. Я дважды проверяю это особенно, и все подключено! но если я поставлю owner: MyView () вместо owner: self, тогда это сработает!
Ответ №2:
customeView
является свойством типа. Поэтому self внутри него будет ссылаться MyView.self
на тип класса. Тип класса не содержит переменных экземпляра, которые включают someLabel
.