So, in response to my own question, I added some methods to my open source DejalAppKitCategories to make this easier, and thought that I would share it here for everyone who wants to avoid NSMatrixnow.
Here is the title:
@interface NSButton (DejalRadios)
@property (nonatomic, setter=dejal_setRadiosEnabled:) BOOL dejal_radiosEnabled;
- (void)dejal_selectRadioWithTag:(NSInteger)tag;
- (NSInteger)dejal_selectedRadioTag;
- (NSButton *)dejal_radioPassingTest:(BOOL (^)(NSButton *radio, BOOL *stop))predicate;
- (void)dejal_enumerateRadiosUsingBlock:(void (^)(NSButton *radio, BOOL *stop))block;
@end
And implementation:
@implementation NSButton (DejalRadios)
- (void)dejal_selectRadioWithTag:(NSInteger)tag;
{
[self dejal_enumerateRadiosUsingBlock:^(NSButton *radio, BOOL *stop)
{
radio.state = radio.tag == tag;
}];
}
- (NSInteger)dejal_selectedRadioTag;
{
NSButton *foundRadio = [self dejal_radioPassingTest:^BOOL(NSButton *radio, BOOL *stop)
{
return radio.state;
}];
return foundRadio.tag;
}
- (BOOL)dejal_radiosEnabled;
{
return self.enabled;
}
- (void)dejal_setRadiosEnabled:(BOOL)enabled;
{
[self dejal_enumerateRadiosUsingBlock:^(NSButton *radio, BOOL *stop)
{
radio.enabled = enabled;
}];
}
- (NSButton *)dejal_radioPassingTest:(BOOL (^)(NSButton *radio, BOOL *stop))predicate;
{
for (NSButton *radio in self.superview.subviews)
{
if ([radio isKindOfClass:[NSButton class]] && radio.action == self.action && predicate)
{
BOOL stop = NO;
if (predicate(radio, &stop))
{
return radio;
}
if (stop)
{
return nil;
}
}
}
return nil;
}
- (void)dejal_enumerateRadiosUsingBlock:(void (^)(NSButton *radio, BOOL *stop))block;
{
for (NSButton *radio in self.superview.subviews)
{
if ([radio isKindOfClass:[NSButton class]] && radio.action == self.action && block)
{
BOOL stop = NO;
block(radio, &stop);
if (stop)
{
return;
}
}
}
}
@end
, ,
[self.iconNoneRadio dejal_selectRadioWithTag:self.statusIconKind];
self.iconNoneRadio.dejal_radiosEnabled = use;
- (IBAction)chooseIcon:(id)sender;
{
self.statusIconKind = self.iconNoneRadio.dejal_selectedRadioTag;
[self maintainControls];
}
, ! , , - , , .