0

背景:我正在创建一个音乐应用程序,通过 CoreMIDI 从我的钢琴键盘获取数据。当播放一个音符时,它会通过显示屏幕键盘键被按下来将此传递到 GUI。屏幕键盘目前由 UIButtons 表示。每个“键”(UIButton)都有一个标识符,对应于我的物理钢琴键盘的 MIDI 值。例如,中间 C 的 UIButton 的值为 60,因为这是 MIDI 数据中返回的值。C# 是 61,D 是 62,等等。

问题:如何以编程方式从我的窗口访问所有 UIButton?我需要通过它们的“标识符”字段来访问它们,除非有更优雅的方式来这样做。我已经很久没有为 OSX 编程了(实际上只有几天),而且我已经在 YouTube 上观看了大约 100 个视频,所以我还在学习。我读过一些帖子说每个 UIButton 都是主视图的子视图。我不知道如何通过代码访问按钮。无论您有什么建议都会非常有帮助!提前致谢。

4

2 回答 2

1

假设您在控制器中将所有按钮声明为插座并将它们与您的视图连接。

当心:大量未经测试的伪代码将随之而来;-)

@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

在此处查看此视频以了解“更好”的方式:以编程方式创建多个 UIButton。虽然它适用于 iOS,但同样,它应该给出图片:-D

虽然看看这个:如何以编程方式创建一个基本的 UIButton?

好的。现在,您的控制器将收到例如 D# 的 NoteOn-Event,它对应于 MIDI 音符编号 63。假设这是一个整数,我们可以使用该整数访问我们的钢琴键数组中的相应元素。

所以我们需要一个偏移量来获得正确的索引,偏移量将是 60。为什么?我们的数组从索引 0 开始,但 12 键钢琴的音符编号从 60 开始。

在完整的 88 键钢琴上,第一个 MIDI 音符编号以 21 开头,因此在这种情况下这就是索引。

现在,我们可以使用按下键的 MIDI 音符编号计算数组索引,因此可以在视图中显示按下的相应按钮。

[pianoKeys objectAtIndex:(63-60)];

希望这会有所帮助。

于 2014-01-05T20:45:19.113 回答
0

这是我的第二个问题的答案,其中按钮只能在中间单击:

这是代码(在 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];

似乎设置按钮类型会覆盖我的子类,并将按钮的大小设置回我将其更改为的按钮样式的默认大小。

再次非常感谢人!

于 2014-01-06T06:54:30.787 回答