0

私のアプリでは、コア データ エントリをテーブルビューに一覧表示しています。フォーム ビューとしてモーダルに表示される詳細ビューを使用して、ユーザーがレコードを編集できるようにしたいと考えています。レコードを編集するときに、奇妙な動作を観察しています。

流れ:

  1. ユーザーがテーブルビューにレコードをロードします。-働く
  2. ユーザーが編集するレコードを選択します。-働く
  3. ユーザーは、モーダル フォーム ビューとして表示されるビュー コントローラーでレコードを編集します。-働く
  4. ユーザーが編集を保存し、フォーム ビューを閉じます。-働く
  5. Tableview には、以前に編集したレコードの正しい変更が表示されます。-働く
  6. ユーザーは、編集する別のレコードを選択して、手順 2 ~ 4 を繰り返します。-働く
  7. Tableview は、すべてのレコードの正しいデータを表示します。-動作していません。

ステップ 7 で、テーブルビューは最初に編集されたレコードの表示を元の状態に戻します。以降のレコード編集では、以前のすべての編集が元の状態に戻ります。テーブルビューを閉じて再読み込みすると、レコードは正しく、すべての編集が表示されます。

tableviewのViewWillAppearメソッドで[tableview reload]を使用したのですが、モーダルフォームのView Controllerを閉じたときに発火しないようです。

私のtableviewcontrollerコードでは:

-(void)viewWillAppear:(BOOL)animated
{
    [self.tableView reloadData];
}

探し回っても解決策が見つかりませんでした。誰かが私を正しい方向に向けてくれることを願っています。

ありがとう!

4

2 に答える 2

4

モーダル ビューを表示すると、メイン ビュー コントローラーのビューが消えることはありません。したがって、モーダル ビューを閉じると、viewWillAppear() は呼び出されません。

モーダル ビューにカスタム デリゲート関数を実装し、それをメイン ビュー コントローラーに設定してみてください。データが更新されたら、デリゲート関数を起動して、メイン ビュー コントローラーにある tableView をリロードします。

iOSのデリゲート機能とは何かを理解し、

デリゲート関数の作成方法は次のとおりです。

  1. ModalView.h で:

    // define the protocol for the delegate
    @protocol ModelViewDelegate <NSObject> 
      - (void) didUpdateData;
    @end
    
    @interface ModalView: ViewController {
         //create a delegate instance
         id delegate;
    }
    
    // define delegate instance
    @property (nonatomic, assign) id <ModelViewDelegate> delegate;
    
  2. modalView.m で:

    @synthesize delegate;
    

    次に、関数内で、デリゲート関数を起動する必要がある場所に配置します。次に例を示します。

    - (void) updateDataIntoDatabase{
           ....
           //Update work done.
    
           [self.delegate didUpdateData];
           //dismiss your modalView;
    }
    

したがって、MainViewController.h で、

#import ModalView.h

@interface ModalView: ViewController <ModelViewDelegate > {
      ...
}

MainViewController.m 内で、既に宣言したデリゲート関数を実装する必要があるという警告が表示されます。したがって、デリゲート関数を設定し、やりたいことを実行します。

- (void) didUpdateData{
    [self.tableView reloadData];
}

modalView インスタンスをインスタンス化した後、modelView デリゲートを self に設定することを忘れないでください。そうでない場合、デリゲート関数は起動されません。

modalView.delegate = self;
于 2014-07-03T04:21:45.203 に答える
0

Modal ビューコントローラーをトリガーするときは、完了ブロックを使用します。

-(void)editModal:(id)sender
{
    KDSecondViewController *secondVC = [[KDSecondViewController alloc] init];
    [self presentViewController:secondVC animated:YES completion:^{
        //-- reload your table view when user dismiss the modal view
        [self.tableView reloadData];
    }];
}
于 2014-07-03T04:06:26.880 に答える