Получение текущего состояния NSButtonCell в NSMatrix

Я использую NSMatrix в качестве клавиатуры и звоню:

[selectedCell setEnabled:NO];
[selectedCell setTransparent:YES];

при выборе ключа (для предотвращения повторного выполнения одной и той же операции). Однако мне также хотелось бы иметь возможность «переворачивать» весь выбор, когда он сделан, то есть заменять все удаленные ячейки и скрывать оставшиеся (не выбранные). .

Можно ли перебрать все ячейки моей матрицы и проверить их включенное/прозрачное состояние, используя что-то вроде:

if([selectedCell isEnabled] == NO)
  NSLog(@"the cell is disabled");
if([selectedCell isTransparent] == YES)
  NSLog(@"the cell is transparent");

Приведенный выше код, конечно, не работает, но вы поняли... Я относительный новичок, поэтому любая помощь будет очень признательна. Спасибо :-)


person Bender    schedule 14.01.2010    source источник


Ответы (3)


NSMatrix позволяет получить количество столбцов и количество строк и ячейка в определенной строке и столбец. Итак, сделайте это за пару for циклов.

Переход по тегу может работать, но требует, чтобы вы давали каждой ячейке собственный тег и (в примере, который вы показываете), чтобы все теги были в серии. Любые нечетные числа, повторяющиеся теги или непомеченные ячейки вызовут проблемы.

person Peter Hosey    schedule 16.01.2010
comment
Спасибо за подсказку, Питер. Это намного более чистый способ сделать это, а также избавляет от необходимости «жестко привязывать» размер матрицы к приложению. Ценим ваши отзывы! - person Bender; 17.01.2010

Я использую NSNumber для хранения выбранного индекса группы радио (обрабатывается как NSMatrix в построителе интерфейсов). Чтобы реализовать это, я синтезирую переменную-член, для которой я устанавливаю привязку "Selected Index" группы радио.

@interface MyClass {
  NSNumber* m_selectedIndex;
}
@property (readwrite, assign) NSNumber* selectedIndex;

Кроме того, я добавил перечисление, чтобы сделать значения удобочитаемыми для человека.

typedef enum { APPLE = 0, PLUM = 1 } SELECTION_STATE;
person JJD    schedule 12.10.2010

ОБНОВИТЬ!! Хорошо, ребята, я решил это с помощью:

for(key=1; key <= 16; key++)
if([[numericKeypad cellWithTag:key] isTransparent] == YES)
    // ...or alternatively...
    // if([[numericKeypad cellWithTag:key] isEnabled:NO])
    {
    [[numericKeypad cellWithTag:key] setTransparent:NO];
    [[numericKeypad cellWithTag:key] setEnabled:YES];
    }
else
    {
    //...disable it...
    }

Кажется, я был довольно близок все это время, но я целый день боролся, пытаясь найти правильный синтаксис из-за неопытности. В любом случае большое спасибо :-)

person Bender    schedule 15.01.2010