Скрыть UIlabel через несколько секунд
Я использую следующий код, чтобы скрыть UILabel через несколько секунд. К сожалению, если пользователь закрывает представление во время выполнения NSInvocation, приложение вылетает
- (void)showStatusBarwithText:(NSString*)text{
lblNotification.hidden=NO;
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[lblNotification methodSignatureForSelector:@selector(setHidden:)]];
[invoc setTarget:lblNotification];
[invoc setSelector:@selector(setHidden:)];
lblNotification.text=text;
BOOL yes = YES;
[invoc setArgument:&yes atIndex:2];
[invoc performSelector:@selector(invoke) withObject:nil afterDelay:1];
}
и это ошибка
*** -[UILabel setHidden:]: message sent to deallocated instance 0x1a8106d0
Как я могу решить? Я пытался использовать
[NSObject cancelPreviousPerformRequestsWithTarget:lblNotification]
в - (void)viewDidDisappear:(BOOL)animated
но это не работает
3 ответа
Решение
Вот как вы должны использовать performSelector
- (void)showStatusBarwithText:(NSString*)text{
lblNotification.hidden=NO;
[self performSelector:@selector(hideLabel) withObject:nil afterDelay:1];//1sec
}
-(void)hideLabel{
lblNotification.hidden= YES;
}
или с таймером
[NSTimer scheduledTimerWithTimeInterval:1//1sec
target:self
selector:@selector(hideLabel)
userInfo:nil
repeats:NO];
Почему бы тебе просто не использовать dispatch_afer
? Синтаксис намного более понятен:
- (void)showStatusBarwithText:(NSString*)text{
lblNotification.hidden=NO;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
lblNotification.hidden = YES;
});
}
Это потому, что вы проходите lblNotification
вместо infoc
объект здесь:[NSObject cancelPreviousPerformRequestsWithTarget:lblNotification]
Будет лучше сделать так:
- (void)showStatusBarwithText:(NSString*)text{
lblNotification.hidden=NO;
lblNotification.text=text;
[lblNotification performSelector:@selector(setHidden:) withObject:@(1) afterDelay:2];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated]
[NSObject cancelPreviousPerformRequestsWithTarget:lblNotification];
}