我的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];
}
答案 0 :(得分:20)
好的,我找到了一个可行的解决方法,但我仍然不知道为什么我的原始代码首先不起作用。我使用Grand Central Dispatch在主队列上发送一个包含hide调用的块,如下所示:
dispatch_async(dispatch_get_main_queue(), ^{
self.myButton.hidden = YES; //works
});
有趣。我的IBOutlet中的初始代码都没有包含在GCD块中。有什么想法吗?
答案 1 :(得分:5)
这应该可行,尝试重命名并隐藏它,只是为了检查彼此顶部没有两个按钮。
答案 2 :(得分:3)
我遇到了同样的问题,并且发现解决方案是将隐藏在正确的位置,就我的情况而言viewDidLoad
函数。
答案 3 :(得分:3)
用户界面(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;
}
根据Apple的文档:http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html “ 线程注意事项 必须在主线程上对应用程序的用户界面进行操作。因此,您应该始终从应用程序主线程中运行的代码调用UIView类的方法。这可能不是绝对必要的唯一时间是创建视图对象本身但所有其他操作应该在主线程上发生。 “
答案 4 :(得分:0)
对我来说有用的是将操作代码放在viewDidLoad而不是initWithNibName中,如下所示:
- (void)viewDidLoad
{
btnRestart.enabled = false;
}