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

标签 objective-c ios cocoa-touch midi

作为 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/

相关文章:

ios - 使用 ios 中的自定义委托(delegate)从其他 View Controller 更改一个 View Controller NSSdictonary 的值

objective-c - `-fembed-bitcode` 和 BITCODE_GENERATION_MODE 有什么区别?

objective-c - UICollectionView 未出现

multithreading - 调用performSelectorInBackground : from background thread

iphone - "wait_fences: failed to receive reply: 10004003"?

ios - UITextView 样式在设置文本属性后被重置

objective-c - 如何在 Objective C 中检测图像方向和倾斜

ios - 需要有关 ALAssetsLibrary 枚举的帮助

iphone - 将 UIImage 与另一个图像重叠

ios - 淡出 UIRefreshControl 或将其从透明 ScrollView 中隐藏