3

私のiPhoneアプリケーションには、ナビゲーションコントローラー、メイン画面、およびいくつかの編集画面があります。編集画面で、ユーザーは保存する前に検証する必要のある入力を行います。理想的には、追加の「完了」ボタンなしで、バックナビゲーションでデータを自動的に更新したいと思います。ナビゲーションを停止し、何か問題が発生した場合にエラーメッセージを表示できるように、検証を行って戻るナビゲーションを節約できますか(つまり、ユーザーが標準の戻るボタンをタップしたとき)?

他にもいくつかの可能性があります。

  • カスタムの左ボタンを作成して、標準の背面のように見せます。(なぜAppleはこのボタンスタイルをパブリックAPIに入れなかったのですか?)
  • 「完了」ボタンを追加し、ユーザーがタップした場合にのみデータを保存します

しかし、これらの選択肢はどちらも私はあまり好きではありません。ですから、私が望むことを達成する方法があれば、それを使いたいと思います。

4

6 に答える 6

3

基本的backBarButtonに、ルート ビュー コントローラーのアクションをオーバーライドし、そこで検証を行います。検証に合格した場合は を呼び出しUINavigationController popViewControllerAnimated:、そうでない場合はエラー アラートなどを表示します。

ただし、ルート ビュー コントローラーのtargetおよびプロパティを設定しようとすると、機能しません。どうやらこれらは nil でなければなりません。actionnavigationItem.backBarButton

これを回避する方法として、標準のバック バー ボタンをカスタム ボタンに置​​き換えることが考えられます。標準UIBarButtonItemの でそれを行うこともできますが、これはスタイルの 1 つとして使用できないため、「矢印」の形状が失われます。その回避策として、ボタンにカスタム ビューを使用することがあります。それを行う例については、このスレッドを確認してください。

于 2009-12-15T20:19:11.327 に答える
0

UIViewControllerサブクラスの[popViewControllerAnimated:]をオーバーライドするだけです。このようにして、ViewControllerが画面を離れるというより一般的なシナリオをカバーします。

于 2009-12-16T04:37:19.137 に答える
0

別の方法は、親ビューに作業をさせることです。

データ ビュー (連絡先情報など) からフィールド編集ビュー (名前の編集など) に移動するとします。編集ビューに移動する前に、データ ビューにはこの事実に関するいくつかの情報が保存されます。

self.navigatingTo = NavigatingToNameEdit;

次に、データ ビューのviewWillAppearで、それを確認し、編集ビューから関連情報を抽出します。

if (self.navigatingTo == NavigatingToNameEdit) {
    self.name = self.nameEditView.name;
    // Don't forget to reset navigatingTo:
    self.navigatingTo = NavigatingToNone;
}
于 2009-12-24T00:05:12.963 に答える
0

「戻るボタンが押されたことを検出する」ために私が見つけた最良の方法は、次のviewWillDisappearように再定義することです。

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

ブール値は自分で定義したもので、自分で別の別のコントローラーをプッシュする場所でのみ True に設定します (そうする場合...)。これにより、新しいコントローラーをプッシュしているために呼び出されたことisPushingを区別できます。viewWillDisappearコントローラ自身 vs 戻るボタンが押されたためです。

通常、次のようにテーブルコントローラーで別のコントローラーを自分でプッシュします。

- (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];
}
于 2009-12-16T08:13:35.237 に答える
0

たとえば、ユーザーが UITableView の 1 つの行をタップしている場合の別のアプローチは、タップでビュー コントローラーのポップを開始させることです。

于 2009-12-23T23:43:04.023 に答える
0

しばらく前にこの問題から離れたかもしれませんが、私は今日この問題に遭遇しました。私の推測では、Apple はユーザーがこれらの戻るボタンのアクションをオーバーライドすることを望んでいないのでしょう。私の解決策は、ビューを表示して警告し(移動したばかりのView Controllerに表示されます)、AlertViewsデリゲートメソッド「clickedButtonAtIndex」を使用して、ユーザーをエラーのある画面に戻すことでした。全体的には、実際にはかなりきれいに出くわしたと思います。私の2セント...

于 2010-03-12T21:22:14.770 に答える