2014-11-26 5 views
3

У меня есть один файл xib для пользовательского подкласса UIView. Работает отлично. Я могу загрузить правильный nib и создать экземпляр моего класса, и он содержит все subviews, которые я добавил в xib-файл.Один xib, несколько подкласс

Однако я также подклассифицировал это представление, но не могу понять, как создать экземпляр этого класса и заставить его использовать xib-файл, используемый родительским классом. Возможно ли это? Я не хочу создавать новый xib-файл для моего подкласса, поскольку иерархия представлений, subviews и GUI выглядит одинаково, это просто код, который отличается.

Могу ли я загрузить наконечник и «подключить» его к другому классу, чем тот, который указан как «Пользовательский класс» в настройках xib? Или я могу создать новый экземпляр представления и сказать ему использовать xib определенного имени?

+0

http://stackoverflow.com/questions/5246074/uiview-subclass-with-its-own-xib –

ответ

2

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

Дело в том, что файл .xib хранит набор сериализованных объектов, когда этот набор загружен, информация о каждом объекте, то есть его класс, размер, другие атрибуты, родительский объект, ограничения также десериализуются и применяются. Таким образом, xib-файлы хранят класс, который должен получать +alloc и другие сообщения, и, следовательно, какие объекты будут получать все атрибуты через KVC (-setValue:forKey:). Итак, нет, вы не можете просто настроить некоторый класс для загрузки некоторого xib, потому что файл xib сообщает, какой класс должен быть загружен.

Как душа, я предлагаю реорганизовать ваш код (например), инкапсулировать логику различных подклассов на какой-либо другой объект. Итак, прежде чем у вас будет несколько подклассов с разной логикой, тогда у вас будет один класс, загружаемый из xib, но вы должны установить некоторый объект MyDifferentLogicVariant1Implamentor для сохранения различной логики для «разных» классов.

Superclass - Subclass1 - Subclass2 
vs 
Superclass.differentLogic = DifferentLogicImplementor1 
Superclass.differentLogic = DifferentLogicImplementor2 
+1

Да, это то, что я решил делать. Спасибо за объяснение! – andlin