UIButton setImage不会从非触摸操作更新

时间:2011-09-13 15:05:58

标签: objective-c ios cocoa-touch midi

作为obj-c的noobie,我在这个问题上坚持了一两天。如果有人能提供帮助,我们将不胜感激。

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

我有一个IBAction触发midi消息通过网络发送到我的笔记本电脑 - 一切都很好用。

UIButton的更新发生在笔记本电脑上我的应用程序返回时,通过midi消息,而不是在此函数中的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编程guis,而jbox_redraw是前进的方式(我知道这不是我应该寻找答案的地方,但这是我正在寻找的那种功能)通过midi消息

感谢您抽出时间看这个。

此致 利

1 个答案:

答案 0 :(得分:1)

首先,尝试使用setBackgroundImage forState而不是setImage forState。 如果有可能突出显示您的按钮,请尝试使用按位OR运算符(控件状态为位掩码)为“正常”和“突出显示”等情况添加额外的setImage forState行

UIControlStateNormal | UIControlStateHighlighted

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

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