作为 obj-c 的菜鸟,我已经在这个问题上停留了一两天了。如果有人可以提供帮助,我们将不胜感激。
我正在开发一个 ipad 应用程序,其中的按钮可以更改图像(例如“静音开关”按钮)来代表和控制笔记本电脑上的应用程序。
我有一个 IBAction,可以触发一条 MIDI 消息通过网络发送到我的笔记本电脑 - 在这里一切正常。
UIButton 的更新发生在我的笔记本电脑上的应用程序通过 midi 消息返回时,而不是在这个 void 函数中的 touchDown 的 IBAction 中;
- (void) midiSource:(PGMidiSource*)midi midiReceived:(const MIDIPacketList *)packetList
{
int firstByte = 0;
int secondByte = 0;
int controllerNumber = 0;
int controllerValue = 0;
const MIDIPacket *packet = &packetList->packet[0];
for (int i = 0; i < packetList->numPackets; i++) {
for (int j = 0; j < packet->length; j++) {
if (secondByte) {
controllerValue = packet->data[j];
secondByte = 0;
firstByte = 0;
if (controllerNumber < 8) {
if (!controllerValue) {
[muteButtonIds[controllerNumber] setImage:imageMuted forState:UIControlStateNormal];
[muteButtonIds[controllerNumber] setImage:imageMuted forState:UIControlStateSelected];
}
else {
[muteButtonIds[controllerNumber] setImage:imageUnmuted forState:UIControlStateNormal];
[muteButtonIds[controllerNumber] setImage:imageUnmuted forState:UIControlStateSelected];
}
}
}
if (firstByte) {
secondByte = 1;
controllerNumber = packet->data[j];
}
if (packet->data[j]== 176) {
firstByte = 1;
}
}
packet = MIDIPacketNext(packet);
}
}
当触摸我的 ipad UIButton 时,一切正常,没有问题。 我的问题是,当我从我的笔记本电脑应用程序发送相同的 midi 消息时,我的 ipad 上的 gui 不会更新,直到我触摸应该更改的特定按钮。
我尝试查看 setNeedsDisplay,但这只会引发 autoreleasepool 警告。
我确信这是我所缺少的一些简单的东西。
有人可以帮忙吗?
我有 C 背景,MaxMSP 的编程 GUI,而 jbox_redraw 是通过 midi 前进的方向(我知道这不是我应该寻找答案的地方,但这正是我正在寻找的功能)留言
感谢您花时间查看此内容。
问候, 利伊
最佳答案
首先,尝试使用 setBackgroundImage forState 而不是 setImage forState。 如果您的按钮可能会突出显示,请尝试添加额外的 setImage forState 行,以应对“正常”和“突出显示”等情况,使用按位 OR 运算符(控件状态是位掩码)
UIControlStateNormal | UIControlStateHighlighted
如果您仍然遇到问题,请在为每个状态设置图像后尝试以编程方式选择和取消选择该按钮:
[muteButtonIds[controllerNumber] setSelected:YES];
[muteButtonIds[controllerNumber] setSelected:NO];
关于objective-c - UIButton setImage 未从非触摸操作更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7404138/