Взгляд IBDesignable вызывает бесконечную перестройку

Я пишу подкласс UIView, который использует как IBInspectable, так и IBDesignable. Я не делаю ничего необычного, но мой подкласс заставляет Xcode 6.2 бесконечно перестраивать проект. Мой инспектор удостоверений показывает это колебание состояния под заголовком "Обозначения":

'Designables' state oscillating between 'Updating' and 'Up to date'

Каждый раз, когда сборка перезапускается, инспектор теряет фокус. Это затрудняет редактирование чего-либо из IB, что в первую очередь поражает цель написания этого класса.

Вот реализация моего DesignableTestView:

import UIKit
@IBDesignable class DesignableTestView: UIView {

    @IBInspectable var testBackground:UIColor? {
        didSet {
            if testBackground != nil {
                self.backgroundColor = testBackground
            }
        }
    }
}

Есть ли способ изменить мой код или настройки Xcode, чтобы предотвратить постоянную перестройку?

Ответ 1

Мне интересно, является ли этот класс класса видимости частью текущей цели. В видеоролике WWDC 2014 What New in Interface Builder в демонстрации Live Views они описывают, что первым шагом является обеспечение того, чтобы класс, отдельную целевую платформу. Это видео демонстрирует процесс создания этой целевой целевой среды в рамках проекта.

Если это не проблема. Я бы предложил очистить свой проект ( "Очистить" в меню "Продукт" ) и перестроить только пользовательскую фреймворческую цель, чтобы убедиться, что все нормально, прежде чем пытаться что-либо сделать в IB. Внизу, убедитесь, что структура может быть построена без инцидентов. Если проблема по-прежнему сохраняется после этого, я перейду на следующий уровень и (а) найду папку с данными Xcode; (б) выйти из Xcode; (c) очистить папку с производными данными, (d) перезапустить Xcode и (e) повторить попытку создания цели фрейма.

Ответ 2

У меня все еще была эта проблема (в Xcode 8.3.3) даже после переноса классов IBDesignable в отдельную структуру. Что для меня работало, так это открыть нарушивший Xib файл, снимите флажок "Редактор" > "Автоматическое обновление представлений", а затем перезапустите Xcode.

Ответ 3

Я также все еще имел эту проблему Xcode 9.3 даже после перемещения всех IBDesignables и IBInspectables в отдельную структуру (и очистить все, убить производные данные). IB продолжит перестраивать основную цель и ее зависимости.

Решение, которое я нашел здесь https://www.e-learn.cn/content/wangluowenzhang/307740, решило его:

  1. удалить все @IBDesignable и @IBInspectable
  2. очистить все, очистить производные данные, закрыть Xcode
  3. заново откройте Xcode, заставьте IB перестраивать без IBDesignables (Editor → RefreshAllViews не должен быть серым)
  4. закрыть Xcode
  5. добавить все @IBDesignable и @IBInspectable обратно
  6. открыть Xcode
  7. RefreshAllViews должен быть доступен, щелкните по нему.
  8. вуаля, IB теперь не только перестраивает фреймворк

Очевидно, что в XCode было что-то напуганное, что чистые/убивающие производные данные не стирались.