什么是阻止动作两次射击的更有效方法?

时间:2013-01-22 19:53:54

标签: ios objective-c

当有人在导航栏上点击rightBarButtonItem并快速再次点击程序崩溃时,我遇到了问题。崩溃是可以理解的,因为新视图尚未完成加载,并且按钮仍然可见再次点击,因此它将尝试再次推动视图崩溃程序。我已经尝试了几种方法来尝试防止这种情况并且我当前的实现有些工作,但我知道有一个更好的解决方案,也许是框架内置的解决方案?

- (void) loadView
{
    [super loadView];

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
                                               initWithTitle:@"Members" 
                                               style:UIBarButtonItemStylePlain 
                                               target:self 
                                               action:@selector(showRoster)] autorelease];
}


-(void) showRoster {
    if (seconds + 3 < [[NSDate date] timeIntervalSince1970]) { //This is where I am trying to prevent the button from being activated twice.
        seconds = [[NSDate date] timeIntervalSince1970];

        vcRoster = [[RosterDataViewController alloc] init];
        vcRoster.rosterDataModel.group_id = self.tweetsByGroupIdModel.group_id;
        [self.navigationController pushViewController:vcRoster animated:YES];
    }

}

我也试过这个,但它并没有按照我的想法去做。

if (!self.navigationController.isBeingPresented)

我已经尝试解决问题并用谷歌搜索答案,但我还没有找到解决这个问题的好方法。我知道上面的事情不是一个很好的做事方式,我愿意接受任何改进的建议,因为我对IOS世界非常陌生。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

尝试运行操作方法后立即禁用该按钮:

-(void) showRoster:(UIButton*)sender {
  sender.enabled = NO;
  ...
}

您可以稍后启用它,以使其再次响应。如何最好地做到这一点取决于您显示的视图:如果它是全屏,您可能只需重新启用viewDidAppear:中的按钮(即,在视图消失后,您的按钮再次可见)。

答案 1 :(得分:0)

您应该使用UIViewController的isViewLoaded方法来检查视图是否已加载:

if (self.navigationController.topViewController.isViewLoaded && seconds + 3 < [[NSDate date] timeIntervalSince1970]) {...}