1

我编写了一个计时器应用程序,它从 IBAction 传递一个语音时间并倒计时到 0。有五个不同的语音时间,以及一个用于停止语音时间倒计时的切换按钮。我希望能够在计时器倒计时时禁用未按下 IBAction 的按钮(以防止重置语音时间)。

我目前有几个 [speechButton setEnable:NO] 和 [... setEnable:YES] 调用,它们都按我预期的方式工作;但我怀疑它的内存管理很差,而且代码看起来讨厌。我想实现所有按钮的 NSSet 之类的东西,并仅使用一种方法启用/禁用它们,以便我最终得到 [buttons disable]/[buttons enable]。

我玩过这样的东西:

TimerViewController.h

@implement TimerViewController{
NSButton *buttonA, *buttonB, *buttonC; 
}
@property (retain, readonly) NSSet *hijackableButtons;
-(void)disableButtons
@end

TimerViewController.m

...
@synthesize hijackableButtons;
-(void)init{
//blah blah blah
hijackableButtons = [NSSet setWithObjects:*buttonA,*buttonB,*buttonC,nil];
}
//...

-(void)disableButtons{
for (id buttons in hijackableButtons){
    if (buttons isKindOfClass:[NSButton class]){
        [buttons setEnabled:NO];
    }

但这不起作用。任何建议,将不胜感激!

4

3 回答 3

1

请参阅文档-enumerateObjectsUsingBlock:NSSet

于 2011-11-13T03:27:47.420 回答
1

看看IBOutletCollection为这种情况定义的。

看看这个例子

于 2011-11-13T03:34:23.603 回答
1

我同意 NSResponder 检查,因为在-enumarateObjectUsingBlock:我使用类似的方法之前,我并不相信 Block。

但是对于您的代码,这是您的问题

hijackableButtons = [NSSet setWithObjects:*buttonA,*buttonB,*buttonC,nil];

像这样重写它

hijackableButtons = [NSSet setWithObjects:buttonA, buttonB, buttonC, nil];

删除*此处不需要的。


我假设您是在bla blainit 方法的部分中创建的。
如果它们是 IBOutlet,则此代码不属于您的 init 方法。

于 2011-11-13T03:35:26.427 回答