Одноэлементное вычисляемое свойство в swift 3

#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, и удалите его.

Редактировать:

Я имел в виду, что синглтон загружает перо только один раз, когда я создаю и экземпляр этого класса.

  1. Нет, это так не сработает. Каждый раз, когда вызывается init , также вызывается ваше вычисляемое свойство, и каждый раз создается новый экземпляр из xib.

  2. Как уже упоминал Кариен ван Зил, вы используете self в class переменной, которая соответствует самому MyView классу (или его подклассу, если он вызывается для подкласса), а не экземпляру. Попробуйте nil owner вместо этого передать as .

  3. Для меня вся техника выглядит неправильно. Вы не должны использовать одноэлементный шаблон с UIView подклассами. Нет ничего плохого в том, чтобы вызывать loadNibNamed несколько раз и создавать точно такие же экземпляры. Если вы хотите использовать один и тот же экземпляр несколько раз в иерархии представлений, это невозможно, поскольку каждое представление может иметь только один супервизор. В этом случае вы должны следовать шаблону MVC: создайте несколько MyView экземпляров -> обновляйте модель всякий раз, когда вы что-то меняете в представлении и хотите, чтобы эти изменения были отражены в другом месте -> обновите другое представление, используя обновленную модель.

Комментарии:

1. Я дважды проверяю это особенно, и все подключено! но если я поставлю owner: MyView () вместо owner: self, тогда это сработает!

Ответ №2:

customeView является свойством типа. Поэтому self внутри него будет ссылаться MyView.self на тип класса. Тип класса не содержит переменных экземпляра, которые включают someLabel .

См. Документацию Apple по типам