用于自定义单选按钮的OSX(2016 Redux)中的IBOutletCollections备选方案

时间:2016-07-19 20:05:26

标签: macos custom-controls iboutletcollection

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

我在OS X *中的IBOutletCollections上可以找到的几个问题已经有几年了。我甚至不能评论他们要求,因为我缺乏声望点,因此新的问题。

我做了大量的答案,因为他们帮助我非常有帮助,因为我读过的IBCollections上的博客文章并没有将它们仅仅指定为iOS / UIKit,也没有显示任何错误(SO HELPFUL!/ sarcasm)。

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

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

1 个答案:

答案 0 :(得分: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)。

列组可以由两个原始方法处理,但是当通过另一行中的选择清除行/类别选择时,我还有其他步骤用于变量/默认值更新。事后我可以在选择之后检查每个组的状态。

我的问题可能是独一无二的,但是我发布这个以防万一。

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