Доступ к UIB-кнопкам из интерфейса

Предыстория: я создаю музыкальное приложение, которое получает данные с моей фортепианной клавиатуры через CoreMIDI. Когда нота воспроизводится, она передает ее в графический интерфейс, показывая нажатие клавиши экранной клавиатуры. Наэкранная клавиатура пока представлена ​​кнопками UIB. Каждая "клавиша" (UIButton) имеет идентификатор, который соответствует значению MIDI от моей физической фортепианной клавиатуры. Например, UIButton среднего C будет иметь значение 60, так как это значение, возвращаемое в данных MIDI. C# 61, D 62 и т. Д.

Вопрос: Как мне получить программный доступ ко всем кнопкам UIB из моего окна? Мне нужно получить к ним доступ через поле "идентификатор", если нет более элегантного способа сделать это. Я не программировал для OSX очень долго (фактически только несколько дней), и я буквально посмотрел около 100 видео на YouTube, поэтому я все еще учусь. Я прочитал несколько постов, в которых говорилось, что каждая кнопка UIB является подпредставлением основного представления. Я не мог понять, как получить доступ к кнопкам через код, хотя. Какие бы у вас ни были предложения, они будут очень полезны! Заранее спасибо.

2 ответа

Решение

Предполагая, что у вас есть все кнопки, объявленные как выходы в вашем контроллере, и они подключены к вашему виду.

Осторожно: много непроверенного псевдокода будет следовать;-)

@property IBOutlet UIButton *firstPianoKeyButton;
@property IBOutlet UIButton *secondPianoKeyButton;
@property IBOutlet UIButton *thirdPianoKeyButton;
... and so on ...

Теперь вы можете поместить кнопки одну за другой в массив.

Допустим, у вас есть контроллер с 12 клавишами, начиная с того, что обычно будет серединой C.

NSArray *pianoKeys = [NSArray arrayWithObjects:firstButton, secondButton, thirdButton, ..., nil];

Не приятно, и есть более элегантные и эффективные способы сделать это, но это должно дать картину.

Больше о массивах в целом: NSArray.

Посмотрите это видео здесь для "лучшего" способа: создать несколько UIB-кнопок программно. Это для iOS, хотя, но опять же, это должно дать картину:-D

Хотя проверьте это: Как мне создать базовую UIButton программно?

Хорошо. Теперь ваш контроллер получит, например, NoteOn-событие D#, которое соответствует номеру MIDI-ноты 63. Предполагая, что это целое число, мы можем использовать его для доступа к соответствующему элементу в нашем массиве pianoKeys.

Таким образом, нам нужно смещение, чтобы получить правильный индекс, смещение будет 60. Почему? Наш массив начинается с индекса 0, но наши ноты с 12 клавишами начинаются с 60.

На полном 88-клавишном пианино первый номер ноты MIDI начинается с 21, так что в этом случае это будет индекс.

Теперь мы можем рассчитать индекс массива по номеру MIDI-ноты нажатой клавиши и, следовательно, можем отобразить соответствующую кнопку на виде в нажатом состоянии.

[pianoKeys objectAtIndex:(63-60)];

Надеюсь, это полезно.

Это ответ на мою вторую проблему, когда кнопку можно нажать только посередине:

Вот код (в awakeFromNib):

WhitePianoKey *button = [[WhitePianoKey alloc] initWithFrame:NSMakeRect(20, 20, 40, 300)]; 
[[window contentView] addSubview: button];
[button setButtonType:NSMomentaryPushInButton]; //I removed this line

изменился на

WhitePianoKey *button = [[WhitePianoKey alloc] initWithFrame:NSMakeRect(20, 20, 40, 300)];
[[window contentView] addSubview: button];

Кажется, что установка типа кнопки переопределяет мой подкласс и устанавливает размер кнопки обратно в размер по умолчанию независимо от стиля кнопки, на которую я ее изменил.

Большое спасибо снова человек!

Другие вопросы по тегам