iPhone-如何刷新/重画已更改状态的按钮?

iPhone-如何刷新/重画已更改状态的按钮?,iphone,objective-c,uiview,uibutton,redraw,Iphone,Objective C,Uiview,Uibutton,Redraw,我目前正在使用NSNotifications从我的应用程序代理向iPhone应用程序中的UIView发送消息 UIView收到通知,然后我使用选择器更改UIView上按钮的状态 以下是传递给选择器的函数: -(void)changeButtonState { NSLog(@"Change button state received"); [testButton setEnabled:NO]; [testButton setNeedsDisplay]; } 这会被调用,但

我目前正在使用NSNotifications从我的应用程序代理向iPhone应用程序中的UIView发送消息

UIView收到通知,然后我使用选择器更改UIView上按钮的状态

以下是传递给选择器的函数:

-(void)changeButtonState
{
    NSLog(@"Change button state received");
    [testButton setEnabled:NO];
    [testButton setNeedsDisplay];
}
这会被调用,但是按钮状态从未在视觉上改变,它在功能上被禁用,但在屏幕上看起来仍处于启用状态

所以看起来setNeedsDisplay要么在这里不起作用,要么我的编码不正确


有人能告诉我当我更改状态时应该如何正确地重新绘制按钮或视图吗?

由于UI刷新通常在主线程上完成,因此,
setNeedsDisplay
只会在主线程上被调用。因此,您需要通过使用
performselectornmainthread

确保在主线程上调用它,因为UI刷新通常在主线程上完成,
setNeedsDisplay
只会在主线程上被调用。因此,您需要通过使用
performselectornmainthread

确保在主线程上调用它,我相信您会想到这一点,但因为您在问题中没有提到它只是为了确定:您是否在IB或code中为按钮上的
uicontrolstatemabled
设置了新的图像/标题/etc?通常调用
setEnabled
会自动导致按钮重新绘制其新状态,除非您没有在子类中设置其他状态或重新实现它。您确定
testButton
已连接且未
nil
?我可能错了,但是我认为setNeedsDisplay只有在主线程上被调用时才能工作。所以试着调用
performSelectorOnMainThread
maybe?@Mike C,这很有效,如果你想添加它作为答案,请尝试添加,我会接受的。我相信你会想到这一点,但因为您在问题中没有提及它只是为了确定:您是否在IB或code中为按钮上的
uicontrolstatemabled
设置了新图像/标题/etc?通常调用
setEnabled
会自动导致按钮重新绘制其新状态,除非您没有在子类中设置其他状态或重新实现它。您确定
testButton
已连接且未
nil
?我可能错了,但是我认为setNeedsDisplay只有在主线程上被调用时才能工作。因此,请尝试调用
performSelectorOnMainThread
maybe?@Mike C,这很有效,如果您想添加它作为答案,请尝试这样做,我会接受它。