Подтвердить что ты не робот

Мгновенный просмотр из ошибки nib throws

Я попытался сделать подкласс @IBDesignable UIView следующим образом (ссылка). Первое пользовательское представление прекрасное. Но когда я пытаюсь сделать еще один, у меня есть ошибки. Сначала я получил failed to update auto layout status: the agent crashed и Failed to render instance of .... Как-то я начал билать и запускать проект с этими ошибками, но затем я получаю новую ошибку - EXC_BAD_ACCESS ... в строке let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView. Вот целый метод:

func loadViewFromNib() -> UIView {

        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: "advancedCellView", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }

С первым пользовательским UIView нет проблем. Я использую тот же код.

введите описание изображения здесь

Любые идеи? Спасибо вам

4b9b3361

Ответ 1

Метод loadViewFromNib(), который вы публикуете, выглядит хорошо, вы правильно получаете пакет и указываете имя ниба как строковый литерал, поэтому он должен найти nib. Как комментировал кто-то, возможно, что-то не так с вашей настройкой nib. Вот несколько вещей, которые нужно проверить:

  • У вас должен быть AdvancedCellView установлен как пользовательский класс владельца файла в инспекторе идентификации.
  • Убедитесь, что модуль тоже прав - обычно вы просто хотите, чтобы он был пустым.
  • Пользовательский класс для представления не должен быть установлен, просто оставьте его как значение по умолчанию (UIView). Если у вас есть более описательное имя, чем "Вид" на боковой панели, это, вероятно, неверно.
  • Убедитесь, что у вас есть только один объект верхнего уровня в наконечнике. Боковая панель должна выглядеть так, без каких-либо других записей, когда у вас свернуто дерево View.

Иерархия ниб с одним видом верхнего уровня

N.B. Этот ответ связан с учебным пособием, связанным с OP, а не единственным правильным способом настройки наконечника.

Ответ 2

Метод instantiateWithOwner(options:) возвращает массив, а не представление, поэтому принудительное понижение до UIView никогда не будет работать. Вместо этого попробуйте выполнить кастинг с фактическим типом, [AnyObject].

Элементы в массиве соответствуют объектам верхнего уровня в файле nib, поэтому интересующий вас вид должен быть одним из элементов массива. Учитывая имя вашего файла nib, по всей вероятности, в массиве будет только один объект верхнего уровня - ячейка, которую вы пытаетесь загрузить. Убедитесь, что в файле nib есть только один объект верхнего уровня и что он действительно является экземпляром подкласса UIView.

Обратите внимание, что ваша реализация потенциально неэффективна. Если вы загружаете более одной ячейки, вы должны кэшировать экземпляр UINib вместо создания нового. Обратите внимание, что кластерные классы, такие как UITableViewController, встроены в методы для регистрации наконечников, которые автоматически обрабатывают эти данные, поэтому вам действительно не нужно делать это самостоятельно.

Ответ 3

Попробуйте сделать это вместо этого. Всегда работает для меня:

let picker = NSBundle.mainBundle().loadNibNamed("advancedCellView", owner: nil, options: nil)
let view = picker[0] as! UIView

return view

Сообщите мне, если это работает

Ответ 4

Я смотрел учебник и обнаружил, что если вы подклассифицируете элемент View в своем пользовательском xib, вы получите сообщение об ошибке. Убедитесь, что вы установили "Владелец файла" в свой собственный класс.

введите описание изображения здесь