Программно установить атрибуты NSButton в соответствии с другой NSbutton - PullRequest
2 голосов
/ 23 апреля 2020

У меня есть xib-файл viewController, в котором я разработал кнопку со следующими характеристиками (взято из xib-файла)

<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="HKv-Bv-6j3">
    <rect key="frame" x="126" y="9" width="250" height="32"/>
    <buttonCell key="cell" type="push" title="Disable" bezelStyle="rounded" alignment="center"
 borderStyle="border" imageScaling="proportionallyDown" inset="2" id="YYS-ZL-U1e">
        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
        <font key="font" metaFont="system"/>
     </buttonCell>
</button>

Теперь я могу sh добавить произвольные числа аналогичные кнопки разработаны программно. Как я могу преобразовать XML выше в код объектива - c.

1 Ответ

1 голос
/ 24 апреля 2020

Метод «Почувствуй себя в темноте»

Все теги XML относятся к свойствам или методам NSButton. Некоторые из них являются пользовательскими настройками, например frame. Другие являются значениями по умолчанию (как, например, использование системного шрифта), в этом случае вам не нужно явно устанавливать их. Обратите внимание, что есть также несколько различных объектов - NSButtonCell является частью этого микса (объект buttonCell XML). Вам не нужно создавать это отдельно, но здесь вы найдете некоторые свойства. Вы бы сделали что-то вроде этого:

frame = NSMakeRect(126, 9, 250, 32); // x, y, width height
myButton = [[NSButton alloc] initWithFrame:frame];
myButton.translatesAutoresizingMaskIntoConstraints = NO;
myButton.title = @"Disable";
myButton.bezelStyle = NSBezelStyleRounded;
myButton.alignment = NSTextAlignmentCenter;
myButton.imageScaling = NSImageScaleProportionallyDown; // default value
...

Это не полное воспроизведение, но вы должны понять. Обратите внимание, что некоторые из этих свойств определены в NSButton, а другие (например, alignment) определены в суперклассе, например NSControl.

The Cocoa Way

То есть один способ сделать это. Еще одно решение «Какао» - создать файл XIB с помощью одной кнопки и настроить его по своему вкусу. Затем, когда вам понадобится его копия, загрузите XIB и возьмите его:

NSButton *myButton;
NSArray *topLevelObjects;
[[NSBundle mainBundle] loadNibNamed:@"MyCustomButton"
                              owner:self
                    topLevelObjects:&topLevelObjects];
for (id a in topLevelObjects) {
    if ([a isKindOfClass:NSView.class]) {
        myButton = a;
        break;
    }
}

Если вы поместите только одну кнопку в XIB, вам не понадобится выделенный контроллер. Приведенный выше код загружает XIB, затем захватывает первый найденный NSView, который является вашей кнопкой. Мне нравится этот метод гораздо больше, чем описанный выше, поскольку а) вам не нужно декодировать XML в серию операторов кода, б) вы можете изменить свойства кнопки в Интерфейсном Разработчике в любое время и c ) после того, как вы загрузили кнопку, вы можете сделать ее копию.

...