无法以编程方式隐藏使用IB创build的UIButton

我的iOS UIButton从IB正确地链接到我的视图控制器中的一个IBOutlet,因为我可以从我的代码中改变它的标题。 即:

[self.myButton setTitle:@"new title" forState:UIControlStateNormal]; //works 

然而,

 [self.myButton setHidden:YES]; //doesn't work //or self.myButton.hidden = YES; //doesn't work 

这是怎么回事? 我怎样才能使myButton消失?

更新:一些额外的信息

这里是我的UIButton相关的代码:

在我的.h文件中

 IBOutlet UIButton *myButton; -(IBAction)pushedMyButton:(id)sender; @property (nonatomic,retain) UIButton *myButton; 

在我的.m文件中

 @synthesize myButton; - (void)pushedMyButton:(id)sender{ self.myButton.hidden = YES; } - (void)dealloc{ [self.myButton release]; } 

好吧,我发现了一个解决方法,但我仍然不知道为什么我原来的代码不起作用。 我使用Grand Central Dispatch在主队列中发送包含hide调用的块,如下所示:

 dispatch_async(dispatch_get_main_queue(), ^{ self.myButton.hidden = YES; //works }); 

有趣。 尽pipe我的IBOutlet中的初始代码没有被封装在GCD块中。 有任何想法吗?

这应该工作,尝试重命名和隐藏它只是为了检查有没有两个button在彼此顶部。

我有这个相同的问题,发现解决scheme是把隐藏在正确的地方,在我的情况下在viewDidLoad函数。

用户界面(UI)API(UIKit …)方法必须在主线程上运行!

所以这将在主线程上运行(如* dispatch_get_main_queue *):

 dispatch_async(dispatch_get_main_queue(), ^{ self.myButton.hidden = YES; //works }); 

但通常我们做这样的事情:

 [self performSelectorOnMainThread:@selector(showButton) withObject:nil waitUntilDone:NO]; [self performSelectorOnMainThread:@selector(hideButton) withObject:nil waitUntilDone:NO]; -(void)showButton { myButton.hidden = NO; } -(void)hideButton { myButton.hidden = YES; } 

按照苹果的文档: http : //developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html “ 线程考虑对你的应用程序的用户界面的操作必须发生在主线程上。 ,应该总是从应用程序的主线程中运行的代码中调用UIView类的方法,唯一不是严格需要的是创build视图对象本身,而是在主线程上执行所有其他操作。

什么对我来说是把操作代码在viewDidLoad而不是initWithNibName,像这样:

 - (void)viewDidLoad { btnRestart.enabled = false; }