Невозможно программно скрыть 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;
}