无法以编程方式隐藏使用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; }