- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 AppKit release notes for OS X 10.10 ,苹果写道:
Use of NSMatrix is informally deprecated. We expect to add the formal deprecation macros in a subsequent release, but its use is discouraged in the mean time. The primary use of NSMatrix is for radio button groups, so recall that for applications linked on 10.8 or later, radio buttons that share the same parent view and action will operate as a group.
这一切都很好,但是使用独立按钮时管理单选按钮组很烦人。
我搜索了其他人关于如何处理此问题的建议,以避免为每个按钮单独设置状态
,找到选定的 radio 等,但找不到太多讨论。我想大多数人都在等待 Apple 正式弃用 NSMatrix,并希望提供更好的机制。
最佳答案
因此,为了回答我自己的问题,我在 DejalAppKitCategories open source project 中添加了一些方法为了让这件事变得更容易,我想我应该在这里分享给那些现在想要避免 NSMatrix
的人。
这是标题:
@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
以及实现:
@implementation NSButton (DejalRadios)
/**
Assuming the receiver is a radio button, finds other radio buttons in the group (i.e. in the same superview and with the same action) and selects the one with the specified tag. Invoke this on any of the radios in the group. A replacement for -[NSMatrix selectCellWithTag:].
@param tag The tag value to select.
@author DJS 2015-01.
*/
- (void)dejal_selectRadioWithTag:(NSInteger)tag;
{
[self dejal_enumerateRadiosUsingBlock:^(NSButton *radio, BOOL *stop)
{
radio.state = radio.tag == tag;
}];
}
/**
Assuming the receiver is a radio button, finds other radio buttons in the group (i.e. in the same superview and with the same action) and returns the tag value of the selected radio. Invoke this on any of the radios in the group. A replacement for -[NSMatrix selectedTag].
@returns A tag value integer.
@author DJS 2015-01.
*/
- (NSInteger)dejal_selectedRadioTag;
{
NSButton *foundRadio = [self dejal_radioPassingTest:^BOOL(NSButton *radio, BOOL *stop)
{
return radio.state;
}];
return foundRadio.tag;
}
/**
Returns YES if the radio group is enabled, or NO if not. Simply returns the state of the receiver; the others are assumed to be the same. (If you want to know if they are all enabled or disabled, probably best to use -dejal_enumerateRadiosUsingBlock: to scan the group, and handle a mixed case as needed.)
@author DJS 2015-01.
*/
- (BOOL)dejal_radiosEnabled;
{
return self.enabled;
}
/**
Sets all of the radios in the group to be enabled or disabled. A replacement for -[NSMatrix setEnabled:].
@author DJS 2015-01.
*/
- (void)dejal_setRadiosEnabled:(BOOL)enabled;
{
[self dejal_enumerateRadiosUsingBlock:^(NSButton *radio, BOOL *stop)
{
radio.enabled = enabled;
}];
}
/**
Assuming the receiver is a radio button, finds other radio buttons in the group (i.e. in the same superview and with the same action) and performs the block for each of them, passing the radio to the block. Returns the one that returns YES, or nil if the block requests to stop before completion, or it completes without the block returning YES. Invoke this on any of the radios in the group.
@param block A block that takes a radio button and stop boolean reference as parameters and returns a boolean.
@returns The found radio button, or nil if none is found.
@author DJS 2015-01.
*/
- (NSButton *)dejal_radioPassingTest:(BOOL (^)(NSButton *radio, BOOL *stop))predicate;
{
for (NSButton *radio in self.superview.subviews)
{
// There's no reliable way to determine if a button is actually a radio button, but it's reasonable to assume that no non-radio will have the same action (and having the same action is what makes it a member of the group):
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;
}
/**
Assuming the receiver is a radio button, finds other radio buttons in the group (i.e. in the same superview and with the same action) and performs the block for each of them, passing the radio to the block. Invoke this on any of the radios in the group.
@param block A block that takes a radio button and stop boolean reference as parameters and returns void.
@author DJS 2015-01.
*/
- (void)dejal_enumerateRadiosUsingBlock:(void (^)(NSButton *radio, BOOL *stop))block;
{
for (NSButton *radio in self.superview.subviews)
{
// There's no reliable way to determine if a button is actually a radio button, but it's reasonable to assume that no non-radio will have the same action (and having the same action is what makes it a member of the group):
if ([radio isKindOfClass:[NSButton class]] && radio.action == self.action && block)
{
BOOL stop = NO;
block(radio, &stop);
if (stop)
{
return;
}
}
}
}
@end
要使用这些方法,只需调用组中的任何 radio 即可,例如
[self.iconNoneRadio dejal_selectRadioWithTag:self.statusIconKind];
self.iconNoneRadio.dejal_radiosEnabled = use;
还有:
- (IBAction)chooseIcon:(id)sender;
{
self.statusIconKind = self.iconNoneRadio.dejal_selectedRadioTag;
[self maintainControls];
}
我希望这对其他人有帮助!当然,如果我遗漏了任何明显的内容,或者您有任何建议或意见,请告诉我。
关于macos - 不使用 NSMatrix 的单选按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28132253/
我正在尝试制作一个带有两个选项的单选按钮,“单次”和“扫描”。我将一个单选按钮拖到 Storyboard中,然后使用“编辑器”->“嵌入”将其添加到矩阵中。然后将行数更改为两行。 我在 IB 显示屏中
如何知道 NSMatrix 中选择了多少行和列?我尝试了很多方法,但都不起作用。 我考虑首先通过调用 NSMatrix 的 selectedCells 方法来获取选定的单元格,但后来我不知道该怎么做。
我想跟踪 NSMatrix 中 NSCell 的鼠标悬停事件。文档说我可以将 NSMatrix 模式设置为 NSTrackModeMatrix,当鼠标位于该单元格的范围内时,单元格将收到消息 trac
我正在尝试创建一个 NSButtonCell 的 NSMatrix ,其中可以选择零到四个按钮(打开)。我已尝试以下(测试)代码,但不确定如何提供我需要的功能。也许 NSMatrix 是不可能的,我需
在 AppKit release notes for OS X 10.10 ,苹果写道: Use of NSMatrix is informally deprecated. We expect to
我在 Xcode 8.0 beta 6 中构建时收到此警告。 它列在“不支持的配置”下。 当我在问题导航器中单击它时,文件 Main.storyboard 被选中,但似乎没有选择里面的元素,不知道问题
我有一个 NSMatrix,其中包含 5 个单元格,每个单元格都包含一个图像。 我想避免很好地绑定(bind)每个图像,所以我只有一个 IBOutlet,它是一个 NSMatrix。如何从矩阵中获取每
我想使用 Interface Builder 使用的 NSMatrix 方法创建一组单选按钮,但在代码中。矩阵使用自动布局进行布局。除了在运行时添加新选项外,我基本上都可以使用它。 在下面的示例中,单
如何以编程方式选择 NSMatrix 中的一项?我相信它是一个 NSControl,所以我正在查看该特定文档,但是我找不到有关特定主题的任何信息。 最佳答案 怎么样 -(void)selectCell
我的代码中有一个 NSMatrix,特别是单选按钮。我想创建一个委托(delegate),以便在单选按钮选择更改时发布消息。 我必须使用哪个委托(delegate)?我尝试了 textDidChang
我已经尝试了几次来设置几个类似的按钮,它们都连接到相同的 IBAction,但似乎仍然无法复制 RadioButton 的行为。 目前,我有 5 个按钮,一个 NSView 的所有子项.. NSVie
我需要创建一个 NSMatrix,并将 NSImageCells 绑定(bind)到数组 Controller 。因此,NSMatrix 的内容绑定(bind)到 NSArray(因此矩阵中的 NSI
我正在 NSMatrix 中显示按钮。 我的要求是: to change color of button title and place an image at beginning of title,
我使用 NSMatrix 作为键盘并调用: [selectedCell setEnabled:NO]; [selectedCell setTransparent:YES]; 当选择某个键时(以防止再次
我有一个 NSMatrix,嵌入在 ScrollView 中(使用 IB)。在更改行/列数后使用 -sizeToCells 方法效果很好。但我想将初始矩阵移动到 ScrollView 内。 IB 将
我有一个自定义 NSObjects 的 NSArray。每个对象都有一些属性和一个我想在 GridView 中显示的图像。 NSMatrix 似乎是解决我的问题的一个很好的解决方案,但我在获取要显示的
我正在尝试创建一组按钮,其行为类似于从 IB 创建的单选按钮组。我读自documentation我可以使用 NSRadioModeMatrix 做到这一点,但我不知道如何通过 IB 在矩阵中插入按钮。
我目前正在通过 IB 实例化带有 NSButtonCell 子类的 NSMatrix 我使用身份检查器更改工具提示属性 但工具提示未显示在按钮单元上。 如果我在 NSMatrix 对象上设置工具提示,
我有一个 NSMatrix,它动态填充了一些表单项。现在,我可以方便地调用[theMatrix sizeToCells],然后将其传递到要显示的面板中。 现在,我希望包含此 NSMatrix 的 NS
我有一个 Cocoa Form (xib),其中包含一些 NSTextField 和一个 NSMatrix 的 NSButtonCell。我可以使用“Tab”键来切换 NSTextField,但 NS
我是一名优秀的程序员,十分优秀!