以编程方式根据另一个NSbutton设置NSButton属性

问题描述 投票:1回答:1

我有一个viewController xib文件,在其中设计了一个具有以下特征的按钮(取自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>

现在,我希望以编程方式添加任意数量的类似设计的按钮。如何将上面的XML转换为Objective-C代码。

ios objective-c macos user-interface nsbutton
1个回答
0
投票

“在黑暗中摸索”方法

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

可可方式

这是一种方法。另一个“可可”解决方案是使用单个按钮创建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,即您的按钮。与上面的方法相比,我更喜欢这种方法,因为a)您不必将XML解码为一系列代码语句,b)您可以随时在Interface Builder中更改按钮的属性,以及c)加载该按钮,然后即可对其进行复制。

© www.soinside.com 2019 - 2024. All rights reserved.