UIApplicationDidBecomeActiveNotification и setRightBarButtonItem:animated:

TL;DR Update: в основном, мне нужно отложить мой код до тех пор, пока iOS не закончит свою анимацию "запуска приложения".

Я хотел бы анимировать содержимое панели навигации, когда мое приложение становится активным. В моем контроллере я подписан на UIApplicationDidBecomeActiveNotification и использовать setRightBarButtonItem:animated: выполнить изменение.

Проблема в том, что изменение не анимировано.

Я провел некоторые эксперименты и обнаружил, что если немного подождать ([NSThread sleepForTimeInterval:.3]Анимация без проблем.

Вот простой контроллер представления, демонстрирующий проблему:

@interface TESTViewController ()

@property (strong, nonatomic) IBOutlet UINavigationBar *navigationBar;

@end

@implementation TESTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    UINavigationItem *item = [UINavigationItem new];
    UIBarButtonItem *oldItem = [[UIBarButtonItem alloc] initWithTitle:@"Old" style:UIBarButtonItemStyleBordered target:nil action:NULL];
    [item setRightBarButtonItem:oldItem];
    [[self navigationBar] setItems:@[item] animated:NO];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil];
}

- (void)applicationDidBecomeActiveNotificationAction:(NSNotification *)notification
{
    // [NSThread sleepForTimeInterval:.3];
    UIBarButtonItem *newItem = [[UIBarButtonItem alloc] initWithTitle:@"New" style:UIBarButtonItemStyleBordered target:nil action:NULL];
    [[[self navigationBar] items][0] setRightBarButtonItem:newItem animated:YES];
}

@end

Я хотел бы найти лучшее решение, чем блокировка потока или внесение изменений после фиксированной задержки.

5 ответов

Просто использовать dispatch_after в основной очереди вместо вызова
+[NSThread sleepForTimeInterval:] метод класса.

Передайте свою анимацию как блок, и она должна работать отлично.

Попробуйте переместить [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil]; в viewDidLoad: метод. Я думаю, что объект не зарегистрирован для "UIApplicationDidBecomeActiveNotification"пока он уволен.

Вы пытались выполнить SelectAfterDelay?

Попробуйте что-то вроде этого:

- (void)applicationDidBecomeActiveNotificationAction:(NSNotification *)notification{
     [self performSelector:@selector(yourAnimationAction) withObject:nil afterDelay:1];
}

- (void)yourAnimationAction{
    //Set your NavAnimation here
    [self.navigationItem setRightBarButtonItem:theItem animated:TRUE];
}

Просто измените задержку, чтобы она соответствовала задержке запуска ваших приложений... может быть, это даст эффект?

При публикации уведомлений я не использую ваши методы.

Я использую:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeButton) name:@"changeButton" object:nil]; на приемном конце.

И в конце публикации, я звоню [[NSNotificationCenter defaultCenter] postNotificationName:@"changeButton" object:nil];

Попробуйте переместить ваш код в метод:

-(void)changeButton{

UIBarButtonItem *newItem = [[UIBarButtonItem alloc] initWithTitle:@"New" style:UIBarButtonItemStyleBordered target:nil action:NULL];

[[[self navigationBar] items][0] setRightBarButtonItem:newItem animated:YES];

}

Надеюсь это поможет!

Просто позвони viewDidAppear: вручную из вашего applicationDidBecomeActiveNotificationAction: метод. Поместите код анимации в viewDidAppear: метод. Надеюсь это поможет.

Другие вопросы по тегам