1

我正在尝试将自定义按钮实现为单选按钮组。由于我找不到自定义单选按钮外观(每个状态的开/关/悬停)的方法,因此我将它们实现为自定义图像按钮(NSButton 子类)。那部分工作正常。问题是处理每组按钮的状态以及由组确定的相应变量(每组 1 个)。IBCollections 看起来非常适合这个问题。但我正在编写一个 Mac 应用程序。

我可以在 OS X* 中的 IBOutletCollections 上找到的几个问题已经有几年历史了。我什至不能对他们发表评论,因为我缺乏声誉点,因此是新问题。

我确实赞成这些答案,因为它们提供了极大的帮助,因为我阅读的关于 IBCollections 的博客文章并没有费心将它们指定为 iOS/UIKit,XCode 也没有显示任何错误(太有帮助了!/讽刺)。

无论如何想出另一种方法来实现这一点?对于像这样的一组按钮(或更糟糕的多组),每个单独的插座都是疯狂的。我可以将它们实现为带有 IBOutlets 和 IBActions 的 IB 定义按钮的数组吗?

*很快将恢复到 Mac OS(尽管它会受到大小写挑战:)

4

1 回答 1

1

我不会声称这是一个优雅的解决方案,但我设法通过将自定义按钮与NSArray arrayWithObjects:每个按钮组分组来解决我的问题。

我添加了两种方法来模拟单选按钮的行为(在本例中为自定义颜色按钮):

-(void)setButtonSelected:(NSArray*) theButtons toColor:(NSString*)color {
    [self clearAllButtons:theButtons];
    for (ColorButton *button in theButtons) {
        if ([button.color isEqualToString:color]) {
            button.state = NSOnState;
        }
    }
}

-(void)clearAllButtons:(NSArray*) theButtons {
    for (ColorButton *button in theButtons) {
        button.state = NSOffState;
    }
}

由于我的具体问题涉及一组以上需要唯一选择的按钮,因此我为组中的每个对齐选项(基本上是列)添加了数组。

- (void)clearColorConflicts:(NSArray*)theButtons forRow:(NSString*)row {
    for (ColorButton *button in theButtons) {
        if (![button.row isEqualToString:row]) {
            if (button.state == NSOnState) {
                button.state = NSOffState;
            }
        }
    }
}

同样,它可能不是一个优雅的解决方案,但它在没有 IBOutletCollection 的情况下解决了我的问题。

我确实查看了 NSMatrix,但是当我将自定义按钮分组为矩阵时,我无法使用自定义图像按钮行为(on、off、hover_on、hover_off)。

列组可以通过两种原始方法处理,但是当行/类别选择被另一行中的选择清除时,我有额外的变量/默认值更新步骤。事后看来,我本可以在选择后检查每个组的状态。

我的问题可能是独一无二的,但我发布这个以防它帮助其他人。

我没有标记为已解决,因为我希望有人有比我更好的解决方案。

于 2016-07-22T01:59:37.177 回答