2011-12-23 5 views
0

私はUITabBarController内にUINavigationControllerを持っています。ナビゲーションコントローラには、アイテムを編集するためのUITableViewとフォームがあります。問題は、編集中にタブがタップされると、フォームが消去され、ユーザーがUITableViewにダンプされることです。iOS - 表示からナビゲートするときのプロンプト

編集ビューからのナビゲーションを確認するためのプロンプトを追加する方法はありますか?

+0

私は理解していません - "フォーム"とは何ですか?また、uinavigationcontrollerがビューを変更したとき、またはtabbarcontrollerがビューを変更したときに「確認」アラートを表示しますか?あなたの投稿は1つのものと別のタグを示しています:P – DanZimm

+0

"フォーム"はストーリーボードを介してセグに表示される別のUIViewControllerです。理想的には、私は両方のプロンプトを追加しますが、私は技術が同じであると思います。 – Echilon

答えて

0

最後に、矢印のようなカスタムUIBarButtonItemを使用して解決しました。

1

まず、.hにBOOLを宣言して編集状態を保存します。また、後で選択した行を格納するために使用する一時変数も宣言します。あなたのviewDidLoadで

BOOL isEditing; 
NSUInteger selectedRow; 

、あなたはその後、UITextFieldDelegateUIAlertViewDelegateにあなたのビューコントローラを適合することができますNO

- (void)viewDidLoad { 
    // initialization 
    isEditing = NO; 

    [super viewDidLoad]; 
} 

にブール値を初期化します。テキストフィールドデリゲートは、編集が終了し、テキストフィールドの開始時にコントローラがコールバックを受信できるようにし、アラートビューデリゲートは、アラートビューが閉じられたときにコールバックを受け取ることを許可します。

また、すべてのテキストフィールドの代理人をコントローラに割り当てるように設定する必要があります。 :今そうなどは、以下の2つのメソッドを実装する - あなたがこれをしたら、あなたは、すべてのテキストフィールドからのコールバックを受信するように設定されている

textField.delegate = self; 

:だから、あなたがテキストフィールドを追加するときに、あなたのcellForRowAtIndexPathでこれだけを追加

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    isEditing = YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    isEditing = NO; 
} 

は、今ここで重要なのは、(あなたは、通常、テーブルビューの行が選択されているだろうというときのように)ので、ちょうどこのような何かを、次のビューをプッシュするための別の方法を作ることです。

- (void)showNextView { 
    // in this method create the child view controller and push it 
    // like you would normally when a cell is selected 
    // to get the selected row, use the `selectedRow` variable 
    // we declared earlier. 
} 

これで、ユーザーが行を選択したときにテーブルビューコールバックを実装する必要があります。このメソッドでは、編集中であるかどうかをテストし、編集中の場合はプロンプトを表示します。そうでない場合は、次のビューに進みます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    selectedRow = [indexPath row]; 

    if (isEditing) { 
     UIAlertView *alert = [[UIAlertView alloc] 
        initWithTitle:@"Continue Editing?" 
        message:@"Continue Editing or discard edits" 
        delegate:self 
        cancelButtonTitle:@"Discard" 
        otherButtonTitles:@"Continue"]; 
     [alert show]; 
     [alert release]; 
     return; 
    } 
    [self showNextView]; 
} 

最後に、我々はアラートビューが却下されたときのアラートビューのデリゲートのコールバックを実装する必要があります。

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    if (buttonIndex != [alertView cancelButtonIndex]) return; // stay editing 
    [self showNextView]; 
} 

すべてが理にかなって、あなたに役に立つことを願っています!

+0

しかし、私はストーリーボードを使用しているので、エディットコントローラーは親ビューコントローラー内にあることがわかる限り知識がありません。 – Echilon

0

あなたはUINavigationControllerを使用しているので、あなたがスタック上に、この「フォーム」を推進している場合、あなたは

@property(nonatomic) BOOL hidesBottomBarWhenPushed 

彼らは形で行われるまで、タブバーを非表示にすることでしょうそのように設定することができます。

関連する問題