【问题标题】:Programmatically set NSButton attributes according to another NSbutton根据另一个 NSbutton 以编程方式设置 NSButton 属性
【发布时间】:2020-08-06 15:45:54
【问题描述】:

我有一个 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】:

    “在黑暗中摸索”方法

    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)一旦您已加载按钮,您可以复制它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多