Objective c UIButton setImage未从非触摸操作更新

Objective c UIButton setImage未从非触摸操作更新,objective-c,ios,cocoa-touch,midi,Objective C,Ios,Cocoa Touch,Midi,作为obj-c的要害,我已经在这个问题上纠缠了一两天了。如果有人能帮忙,我将不胜感激 我有一个ipad应用程序,我正在使用改变图像的按钮(想想“静音开关”按钮)来表示和控制我笔记本电脑上的应用程序 我有一个iAction,它可以触发一个midi消息,通过网络发送到我的笔记本电脑上——在这里一切都很好 UIButton的更新是通过midi消息从笔记本电脑上的我的应用程序返回时发生的,而不是在这个无效函数中的iAction中进行的 - (void) midiSource:(PGMidiSou

作为obj-c的要害,我已经在这个问题上纠缠了一两天了。如果有人能帮忙,我将不胜感激

我有一个ipad应用程序,我正在使用改变图像的按钮(想想“静音开关”按钮)来表示和控制我笔记本电脑上的应用程序

我有一个iAction,它可以触发一个midi消息,通过网络发送到我的笔记本电脑上——在这里一切都很好

UIButton的更新是通过midi消息从笔记本电脑上的我的应用程序返回时发生的,而不是在这个无效函数中的iAction中进行的

    - (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);
        }
    }
-(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];
对于(int i=0;inumPackets;i++){
对于(int j=0;jlength;j++){
if(第二字节){
controllerValue=数据包->数据[j];
第二字节=0;
第一字节=0;
如果(控制器编号<8){
如果(!controllerValue){
[MuteButtonInDS[controllerNumber]setImage:imageMuted for状态:UIControlStateNormal];
[MuteButtonInDS[controllerNumber]setImage:imageMuted for状态:uicontrol状态选择];
}
否则{
[MuteButtonInDS[controllerNumber]设置图像:图像为状态取消静音:UIControlStateNormal];
[MuteButtonInDS[controllerNumber]设置图像:图像取消静音状态:UIControlStateSelected];
}
}
}
if(第一字节){
第二字节=1;
controllerNumber=数据包->数据[j];
}
if(数据包->数据[j]==176){
第一字节=1;
}
}
packet=MIDIPacketNext(packet);
}
}
当触地我的ipad按钮时,一切都很好,没有问题。 我的问题是,当我从我的笔记本电脑应用程序发送相同的midi信息时,我的ipad上的gui不会更新,直到我按下了应该更改的特定按钮

我尝试查看setNeedsDisplay,但这只会抛出自动释放池警告

我肯定我错过了一些简单的东西

有人能帮忙吗

我来自C语言背景,为MaxMSP编程GUI,而jbox_redraw是未来的发展方向(我知道这不是我应该寻找答案的地方,但这是我正在寻找的功能)通过midi消息

谢谢你花时间看这个

问候,,
Leigh

首先,尝试使用setBackgroundImage for State而不是setImage for State。 如果您的按钮可能会高亮显示,请尝试使用按位OR运算符(控制状态为位掩码)为“正常”和“高亮显示”等情况下的状态行添加其他setImage

如果仍有问题,请在设置每个状态的图像后,尝试以编程方式选择和取消选择按钮:

[muteButtonIds[controllerNumber] setSelected:YES];
[muteButtonIds[controllerNumber] setSelected:NO];

我已经试过使用背景图像。随着进一步的挖掘,我意识到我试图用错误的思路来做这件事。高优先级线程用于解析midi,据我所知,UI工作需要在主线程中完成。我通过将UIButton消息移动到一个void函数并使用“performSelectorOnMainThread”链接到该函数,解决了这个问题。此外,在昨晚的进一步代码开发和大量阅读中,我意识到我真的应该在没有界面构建器的情况下学习和构建我的UI,因为我最终将需要许多图像/按钮/滑块
[muteButtonIds[controllerNumber] setSelected:YES];
[muteButtonIds[controllerNumber] setSelected:NO];