2009-12-15 34 views
3

在我的iPhone應用程序中,我有導航控制器,主屏幕和一些編輯屏幕。在編輯屏幕上,用戶做一些必須經過驗證的輸入,然後才能保存。理想情況下,我想在後退導航中自動更新數據,而無需額外的「完成」按鈕。我可以做一些驗證並保存回導航(即當用戶點擊標準的後退按鈕時),以允許我停止導航並在出現問題時顯示一些錯誤消息嗎?iPhone:保存驗證後導航

我看到其他幾個可能性:

  • 創建我的自定義左邊的按鈕,使背面看起來像標準。 (爲什麼蘋果沒有把這個按鈕樣式到公共API?)
  • 新增「完成」按鈕,只有當它的用戶水龍頭

但是這兩種選擇,我喜歡少得多保存數據。所以如果有辦法實現我想要的,我想使用它。

回答

3

基本上你想覆蓋你的根視圖控制器的backBarButton的行動,並在那裏做你的驗證。如果驗證通過,請撥打UINavigationControllerpopViewControllerAnimated:,否則顯示錯誤警報或其他內容。

但是,如果您嘗試爲根視圖控制器navigationItem.backBarButton設置targetaction屬性,它將不起作用。顯然這些必須是零。

一個方法可能用一個自定義按鈕來替換標準的back bar按鈕。你可以用標準UIBarButtonItem來做到這一點,但是你會失去'箭頭'的形狀,因爲它不能作爲其中一種樣式。解決方法可能是使用按鈕的自定義視圖。查看this thread作爲一個例子。

+0

這正是我的選擇#1,但如果這是可能的,我不喜歡模擬本地外觀和感覺。 – SergGr 2009-12-15 20:51:13

0

只需在您的UIViewController子類中覆蓋[popViewControllerAnimated:]即可。這樣你就可以覆蓋視圖控制器離開屏幕的更一般的場景。

+0

不能這樣做:popViewControllerAnimated來自UINavigationController,而不是UIViewController ...他必須爲此創建UINavigationController的特定(和單獨的)後代 - 完全不推薦。 – 2009-12-16 08:06:17

0

我發現,「檢測時,後退按鈕被按下」最好的辦法是重新定義viewWillDisappear像這樣:

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    if (!isPushing) { 
     // Apply your changes here 
    } 
} 

布爾isPushing將是一個自己定義的,你把它設置爲True只有在你自己推動另一個控制器的地方(如果你這樣做的話),你可以區分viewWillDisappear,因爲你正在自己推新控制器,因爲後退按鈕被按下。

你常常使另一個控制器自己在一個表控制器像這樣:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Example of pushing a new controller onto the navigation stack yourself... 
    isPushing = YES; // You have to set that boolean here... 
    [self.navigationController pushViewController:myNewController animated:YES]; 
} 
+0

我知道我可以攔截事件,事情是我目前沒有看到停止導航的方法。如果我無法停止導航,如果輸入驗證失敗,我無法做任何事情 – SergGr 2009-12-16 09:31:25

0

另一種方法,比如說,如果用戶在敲擊一行在一個UITableView將有水龍頭啓動視圖控制器流行。

0

另一種方法是讓你的父視圖做這項工作。假設您從數據視圖(例如聯繫人信息)導航到字段編輯視圖(例如名稱編輯)。 在進入編輯視圖之前,數據視圖存儲關於這個事實的一些信息,例如,:

self.navigatingTo = NavigatingToNameEdit; 

那麼你的數據視圖的viewWillAppear,檢查該和提取編輯視圖中的相關信息:

if (self.navigatingTo == NavigatingToNameEdit) { 
    self.name = self.nameEditView.name; 
    // Don't forget to reset navigatingTo: 
    self.navigatingTo = NavigatingToNone; 
} 
0

雖然你可能已經從這個前一陣感動,我只是今天遇到這個問題。我的猜測是,蘋果不希望你重寫那些後退按鈕的動作。我的解決方案是顯示和警告視圖(它顯示在視圖控制器上,您剛剛移動到)並使用AlertViews委託方法「clickedButtonAtIndex」將用戶移回到出現錯誤的屏幕。總的來說,我認爲它實際上是非常乾淨的。我的2美分...