Как я могу зарегистрировать CustomLayoutManager при создании экземпляра UITextView из раскадровки

Я хочу адаптироваться CustomeLayoutManager в UITextView, Итак, я сделал подкласс (CustomTextView) из UITextView,

final class CustomTextView: UITextView {

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        let storage = NSTextStorage()
        let layout = CustomLayoutManager()
        storage.addLayoutManager(layout)
        let container = NSTextContainer()
        container.widthTracksTextView = true
        layout.addTextContainer(container)
        super.init(frame: frame, textContainer: container)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

CustomTextView сгенерированный кодом работает нормально. Однако я не знаю, как адаптировать CustomLayoutManager когда экземпляр создается из stroyboard

Благодарю.

2 ответа

Вы можете установить пользовательский класс в раскадровке, щелкнув Identity Inspector на правой панели и введя имя пользовательского класса в поле "Class".

Также вам необходимо реализовать код инициализации в обоих методах инициализации.

init(frame:) is called whenever you create a view(or subclass) object using UIView(frame:) method.

init(coder:) is called whenever your view(or subclass) is created from the storyboard.
  1. В вашей раскадровке выберите ваш UITextView,
  2. Выберите инспектора идентичности (правая панель) и укажите имя класса какCustomTextView,

Теперь, когда ваша раскадровка создает объект textView это будет типа CustomTextView,

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

Таким образом, проблема воспроизводима. init не вызывается, когда вы instantaite от раскадровки, но init(coder:) называется. Кажется, вы должны сделать это программно.

Другие вопросы по тегам