1

当有人点击导航栏上的 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 世界非常陌生。提前感谢您的帮助。

4

2 回答 2

6

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

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

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

于 2013-01-22T19:58:54.300 回答
0

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

if (self.navigationController.topViewController.isViewLoaded && seconds + 3 < [[NSDate date] timeIntervalSince1970]) {...} 
于 2013-01-22T20:09:45.813 回答