我编写了一个计时器应用程序,它从IBAction传递一个speechTime并向下计数到0.有五个不同的speechTimes,以及一个停止语音时间倒计时的切换按钮。我希望能够在计时器倒计时时禁用不按下IBAction的按钮(以防止重置speechTime)。
我目前有几个[speechButton setEnable:NO]和[... setEnable:YES]调用,它们都按我期望的方式工作;但我怀疑这是糟糕的内存管理,并使真的令人讨厌的代码。我想实现类似所有按钮的NSSet之类的东西,并且仅使用一种方法启用/禁用它们,以便我最终使用[按钮禁用] / [按钮启用]。
我玩过这样的事情:
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];
}
但这不起作用。任何建议将不胜感激!
答案 0 :(得分:1)
请参阅-enumerateObjectsUsingBlock:
文档中的NSSet
。
答案 1 :(得分:1)
查看为此情况定义的IBOutletCollection
。
看看这个example。
答案 2 :(得分:1)
我同意NSResponder检查-enumarateObjectUsingBlock:
我没有说服Block,直到我使用类似的方法。
但对于您的代码,这是您的问题
hijackableButtons = [NSSet setWithObjects:*buttonA,*buttonB,*buttonC,nil];
像这样重写它
hijackableButtons = [NSSet setWithObjects:buttonA, buttonB, buttonC, nil];
重新停止此处不需要的*
。
我假设您是在init方法的bla bla
部分创建的
如果它们是IBOutlet,则此代码不属于您的init方法。