背景:我正在创建一个音乐应用,通过CoreMIDI从我的钢琴键盘获取数据。播放音符时,它会通过将屏幕键盘键显示为按下来将其传递给GUI。屏幕键盘现在由UIButtons表示。每个“键”(UIButton)都有一个与我的物理钢琴键盘的MIDI值相对应的标识符。例如,中间C的UIButton的值为60,因为这是MIDI数据中返回的值。 C#是61,D是62,等等。
问题:如何以编程方式从我的窗口访问所有UIButton?我需要通过“标识符”字段访问它们,除非有更优雅的方法。我没有为OSX编程很长时间(实际上只有几天)我在YouTube上观看了大约100个视频,所以我还在学习。我已经阅读了一些帖子,说每个UIButton都是主视图的子视图。我无法弄清楚如何通过代码访问按钮。无论你有什么建议都会非常有帮助!提前谢谢。
答案 0 :(得分: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。
点击此视频,了解“更好”的方式:Create Multiple UIButtons Programmatically。它适用于iOS,但同样,它应该给出图片:-D
虽然看看这个:How do I create a basic UIButton programmatically?
好。现在,你的控制器将接收例如D#的NoteOn-Event,它对应于MIDI音符编号63.假设这是一个整数,我们可以使用那个来访问我们的pianoKeys-array中的相应元素。
所以我们需要一个偏移来获得正确的索引,偏移量将是60.为什么?我们的数组从索引0开始,但是12键钢琴的音符编号从60开始。
在一把完整的88键钢琴上,第一个MIDI音符编号从21开始,因此在这种情况下它就是索引。
现在,我们可以使用按下的键的MIDI音符编号计算数组索引,因此可以在视图中显示相应的按钮。
[pianoKeys objectAtIndex:(63-60)];
希望这有用。
答案 1 :(得分: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];
似乎设置按钮类型会覆盖我的子类,并将按钮的大小设置回默认大小,无论按钮的样式是什么,我将其更改为。
再次感谢man!