2013-01-22 77 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

相關問題