UIButton事件在快速点击时推动多次调用视图控制器

时间:2015-07-07 21:51:02

标签: ios objective-c uibutton ibaction

我的UIButton中显示了UIViewController。此按钮通过xib(touchUpInside)

绑定到以下IBAction
- (IBAction)messagesButtonPressed:(id)sender {
    ChatsViewController* chatsVC = [[ChatsViewController alloc] initWithNibName:@"ChatsViewController" bundle:nil];
    [self.navigationController pushViewController:chatsVC animated:YES];
}

我注意到在临时挂起UI的登录操作期间,如果用户反复点击此按钮,则当登录操作完成时,此事件将被触发TWICE。这导致以下结果:

nested push animation can result in corrupted navigation bar
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

此外,当我从此视图返回时,我最终会在同一页面上显示可见状态/导航栏和黑色内容区域。此时再次单击后退按钮会导致崩溃。

根据我的理解,iOS在无响应期间排队交互,这可能是导致此行为的原因。我添加的解决方法只是禁用IBAction中的用户交互并在viewWillAppear中重新启用。 e.g。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // ...
    [self.messagesButton setUserInteractionEnabled:YES];
}

- (IBAction)messagesButtonPressed:(id)sender {
    [self.messagesButton setUserInteractionEnabled:NO];
    ChatsViewController* chatsVC = [[ChatsViewController alloc] initWithNibName:@"ChatsViewController" bundle:nil];
    [self.navigationController pushViewController:chatsVC animated:YES];
}

是否有更安全的方法来阻止这种多点触控?

编辑:我应该提到我已经尝试启用exclusiveTouch,并且在登录完成后也无法重现这一点,无论我按下此按钮多快,UI都恢复正常。

3 个答案:

答案 0 :(得分:0)

对我来说似乎很奇怪,你有能力点击"聊天"您没有登录时按钮。

如果您在登录过程完成之前禁用用户互动,那么解决不了吗?

userInteractionEnabled是合适的。

答案 1 :(得分:0)

您问题的简单解决方案是

一旦登录请求被触发,你应该禁用该按钮,

如果请求成功,则推送到另一个视图,如果失败,则启用登录按钮

答案 2 :(得分:0)

在更改状态之前检查isSelected属性os按钮。 如果“未”选中,则进行设置。因此管理你的cdoe。