Невозможно программно скрыть UIButton, созданный с помощью IB
My 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];
}
Ответы
Ответ 1
Хорошо, я нашел обходное решение, которое работает, но я до сих пор не знаю, почему мой исходный код не работал в первую очередь. Я использовал Grand Central Dispatch для отправки блока, содержащего вызов hide в главной очереди, например:
dispatch_async(dispatch_get_main_queue(), ^{
self.myButton.hidden = YES; //works
});
Интересно. Однако ни один из исходного кода в моем IBOutlet не был включен в блоки GCD. Любые идеи?
Ответ 2
Это должно сработать, попробуйте переименовать его и спрячьте его, чтобы убедиться, что между ними нет двух кнопок.
Ответ 3
У меня была такая же проблема, и я решил, что решение заключается в том, чтобы поместить скрытое в нужное место, в моем случае в функцию viewDidLoad
.
Ответ 4
API пользовательского интерфейса (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
"
Вопросы Threading
Манипуляции к пользовательскому интерфейсу приложений должны присутствовать в основном потоке. Таким образом, вы всегда должны вызывать методы класса UIView из кода, запущенного в основном потоке вашего приложения. Единственный раз, когда это может быть не обязательно, нужно создавать сам объект представления, но все другие манипуляции должны происходить в основном потоке.
"
Ответ 5
Что сработало для меня - это ввести управляющий код в viewDidLoad вместо initWithNibName, например:
- (void)viewDidLoad
{
btnRestart.enabled = false;
}