Цель C - Могу ли я использовать NSSet для setEnabled: NO для набора NSButtons? - PullRequest
1 голос
/ 13 ноября 2011

Я написал приложение таймера, которое передает speechTime из IBAction и ведет обратный отсчет до 0. Имеется пять различных speechTimes и кнопка переключения, которая останавливает обратный отсчет времени речи.Я хотел бы иметь возможность отключить кнопки, которые не являются нажатыми IBAction, в то время как таймер обратного отсчета (для предотвращения сброса речи).

В настоящее время у меня есть несколько [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];
    }

Но это не работает,Любые предложения будут оценены!

Ответы [ 3 ]

1 голос
/ 13 ноября 2011

Посмотрите на IBOutletCollection, который определен для этой ситуации.

Посмотрите на этот пример .

1 голос
/ 13 ноября 2011

Я согласен с проверкой NSResponder для -enumarateObjectUsingBlock: Я не был убежден в Блоке, пока не использовал такой метод.

НО для вашего кода, это ваша проблема

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

переписать это так

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

Удалите *, которые здесь не нужны.


Я предполагаю, что вы созданы в разделе bla bla вашего метода init.
Если это IBOutlet, этот код не принадлежит вашему методу init.

1 голос
/ 13 ноября 2011

См. -enumerateObjectsUsingBlock: в документации NSSet.

...