[英]Can't programmatically hide UIButton created with IB
我的 iOS UIButton 已從 IB 正確鏈接到我的視圖控制器中的 IBOutlet,因為我可以從我的代碼中更改其標題。 IE:
[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
});
有趣。 我的IBOutlet中的初始代碼都沒有包含在GCD塊中。 有任何想法嗎?
這應該工作,嘗試重命名並隱藏它只是為了檢查彼此頂部沒有兩個按鈕。
用戶界面(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類的方法。唯一可能不是絕對必要的時候是創建視圖對象本身但所有其他操作應該在主線程上發生。
我有同樣的問題,發現解決方案是將隱藏在正確的位置,在我的情況下在viewDidLoad
函數中。
對我有用的是將操作代碼放在viewDidLoad而不是initWithNibName中,如下所示:
- (void)viewDidLoad
{
btnRestart.enabled = false;
}
有同樣的問題:button.hidden = YES 沒有隱藏。
當我使用 .m 文件中的 @property 和 @synthesize 在 .h 文件中定義它時解決了它,從而使其成為 self.button。
現在 self.button.hidden = YES 有效
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.