Uiview 从界面访问UI按钮

Uiview 从界面访问UI按钮,uiview,uibutton,midi,coremidi,piano,Uiview,Uibutton,Midi,Coremidi,Piano,背景:我正在创建一个音乐应用程序,通过CoreMIDI从我的钢琴键盘获取数据。当播放一个音符时,它会通过显示屏幕上的键盘键来将其传递到GUI。目前,屏幕键盘由UIButtons表示。每个“键”(UIButton)都有一个标识符,对应于我的物理钢琴键盘上的MIDI值。例如,中间C的UIButton的值为60,因为这是MIDI数据中返回的值。C是61,D是62,等等 问题:如何通过编程方式从窗口访问所有UIButton?我需要通过“标识符”字段访问它们,除非有更优雅的方法。我已经很长时间没有为OSX

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


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

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

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

现在可以做的是,将按钮一个接一个地放入数组中

假设你有一个有12个键的控制器,从中间的C开始

NSArray *pianoKeys = [NSArray arrayWithObjects:firstButton, secondButton, thirdButton, ..., nil];
不太好,还有更优雅、更有效的方法可以做到这一点,但这应该能说明问题

有关阵列的详细信息:

请在此处查看此视频,了解“更好”的方法:。虽然它是针对iOS的,但同样,它应该给出图片:-D

尽管你可以看看这个:

好的。现在,您的控制器将接收例如D#的NoteOn事件,该事件对应于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];
似乎设置按钮类型会覆盖我的子类,并将按钮的大小设置回我更改为的按钮样式的默认大小


再次感谢你,伙计

你似乎回答了我所有的问题托拜厄斯:)再次感谢。我认为我文章的标题应该是“NSButtons”,而不是UIButtons,因为UIButtons显然只是iOS而已:/你给我的视频是针对iOS的,这与iOS非常不同。我不得不把NSButton子类化。我有一个奇怪的问题;也许你能帮忙。我创建了一个名为WhitePianoKey的类,我用它来为NSButton子类。我遵循另一个教程,并得到了一切工作。我所做的唯一更改是使用您建议的教程以编程方式创建按钮。我的问题是,当我直接点击它的中间时,我只能得到“按下”按钮……有任何想法吗?啊哈,这就是为什么我在搜索UIButton时找不到任何东西的原因。很高兴我的回答在最后起到了作用。嘿,太好了,它成功了。顺便说一下,对于其他问题,最好打开一个新主题。您将通过它联系到更多的人,从而更快地做出响应。当你的钢琴应用程序完成时,请告诉我。一年前开始学钢琴:-)好的,可以:)是的,完成后我会告诉你的…可能需要一段时间!
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];