UIApplicationDidBecomeActiveNotification和setRightBarButtonItem:animated:

时间:2013-03-06 16:49:23

标签: ios objective-c cocoa-touch uinavigationbar uiapplication

TL; DR更新:基本上我需要的是延迟我的代码,直到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 个答案:

答案 0 :(得分:4)

只需在主队列中使用dispatch_after,而不是调用
+[NSThread sleepForTimeInterval:]类方法。

将动画作为块传递,它应该可以正常工作。

答案 1 :(得分:0)

发布通知时,我不使用您的方法。

我用:

[[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];

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

希望这有帮助!

答案 2 :(得分:0)

您是否尝试过执行SelectorAfterDelay?

尝试这样的事情:

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

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

只需更改延迟以适应您的应用唤醒延迟...也许这会产生效果?

答案 3 :(得分:0)

尝试移动    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil];viewDidLoad:方法。我认为对象在被解雇时没有注册“UIApplicationDidBecomeActiveNotification”。

答案 4 :(得分:-1)

只需在viewDidAppear:方法中手动拨打applicationDidBecomeActiveNotificationAction:即可。将动画代码放在viewDidAppear:方法中。希望这会有所帮助。