2013-01-22 38 views
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世界非常陌生。预先感谢您的帮助。

回答

6

尝试尽快行动方法运行禁用按钮:

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

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

+0

我想我需要传递一些信息与选择,因为当我用你的代码,我得到这个错误。 - [TweetsByGroupIdViewController showRoster]:无法识别的选择器发送到实例0x3b5d20 – Caimen

+0

是那个控制器上的方法?这是一个叫它的UIControl吗? –

+0

是的,它在那个控制器上,我相信在我发布的代码中它是一个UIBarButtonItem。在我的代码中尝试时考虑了这一点。但是,它似乎没有看到发件人参数,因为我认为该参数没有被传递。 – Caimen

0

您应该使用UIViewController的isViewLoaded方法来检查,如果视图已经被加载:

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

我试过了你发布的这段代码的几个变种,但是没有一个阻止这个动作试图推出视图控制器两次。 – Caimen

相关问题