Поле NSTextField, созданное из пользовательского класса, отображается случайным образом

#swift #subclass #nsview #nstextfield #nsbutton

Вопрос:

У меня есть основной NSView с 2 подвидами NSView, каждый из которых содержит пользовательский NSButton (все они созданы в построителе интерфейсов). Мой пользовательский класс кнопок программно создает поле NSTextField под кнопками, добавляя его из супервизора: введите описание изображения здесь

И пользовательский код класса NSButton:

 class buttonUpDown: NSButton {
    var myLabel:NSTextField!
    
    required public init?(coder: NSCoder) {
        super.init(coder: coder)
        let labelWidth=CGFloat(90)

        print("init")
        superview?.autoresizesSubviews = false
        myLabel = NSTextField(frame: NSMakeRect(frame.origin.x frame.size.width/2-labelWidth/2,frame.origin.y-20,labelWidth,16))
        
        myLabel?.stringValue = "Mesh Quality"
        myLabel.alignment = .center
        myLabel.font? = .systemFont(ofSize: 8)

        myLabel.backgroundColor = .red
        myLabel.isBordered = false
        myLabel.isEditable = false

        superview!.addSubview(myLabel)
    }
}
 

Когда у меня есть одна кнопка, ссылающаяся на класс, метка отображается правильно.
введите описание изображения здесь

Но когда у меня есть 2, только 1 метка появляется случайным образом слева или справа: введите описание изображения здесь

Чего мне не хватает, чтобы под каждой кнопкой отображался текст ?

Комментарии:

1. Вы пробовали «Захватить иерархию представлений», чтобы проверить представление?

2. Спасибо, не знал об этой функциональности ! Кажется, я нашел проблему. Создание метки в функции инициализации приведет к неправильному позиционированию рамки вида. Добавление их из функции рисования делает его более последовательным.

Ответ №1:

Нашел проблему. Создание метки в функции инициализации приведет к неправильному позиционированию рамки вида. Добавление их из функции рисования делает ее более надежной.

Комментарии:

1. Пожалуйста, не делайте этого в drawRect. Вместо этого используйте viewDidAppear