Скажем, я хочу init
создать UIView
подкласс с a String
и an Int
.
Как мне сделать это в Swift, если я просто создаю подклассы UIView
? Если я просто init()
создаю настраиваемую функцию, но параметрами являются String и Int, он сообщает мне, что «super.init () не вызывается перед возвратом из инициализатора».
И если я звоню, super.init()
мне говорят, что я должен использовать назначенный инициализатор. Что мне там использовать? Каркасная версия? Версия кодера? Обе? Зачем?
источник
var
. Но лучшая практика по умолчанию в Swift - объявлять переменные,let
если нет причины для их объявленияvar
. Следовательно, в моем примере кода выше не было такой причиныlet
.init(coder:)
.s
иi
Необязательно, чтобы здесь было проще. Если бы они не были необязательными, их также нужно было бы инициализировать в требуемом инициализаторе. Сделать их необязательными означает, что они будут существоватьnil
приsuper.init()
вызове. Если бы они не были необязательными, их действительно нужно было бы назначить перед вызовом super.init ().Я создаю общий init для обозначенных и требуемых. Для удобства я передаю его
init(frame:)
с нулевым кадром.Наличие нулевого кадра не является проблемой, потому что обычно представление находится внутри представления ViewController; ваше настраиваемое представление получит хороший и безопасный шанс разместить свои подвиды, когда его супервизор вызывает
layoutSubviews()
илиupdateConstraints()
. Эти две функции вызываются системой рекурсивно по всей иерархии представлений. Вы можете использовать либо,updateContstraints()
либоlayoutSubviews()
.updateContstraints()
сначала вызывается, затемlayoutSubviews()
. ВupdateConstraints()
Обязательно позовите супер последний . Во- первыхlayoutSubviews()
, позвони супер .Вот что я делаю:
источник
commonInit
методе, ноsuper
в этом случае вы не можете разместить его после, потому что вы должны инициализировать все свойства ПЕРЕДsuper
вызовом. Lol это похоже на мертвую петлю.Вот как я это делаю на iOS 9 в Swift:
Вот полный проект с примером:
источник
super.init
, но он сказал, что это должно быть сделано доsuper.init
...Вот как я делаю Subview на iOS в Swift -
источник