3

ストーリーボードを使用して、現在静的な Uitableview を持っています。ユーザーが親テーブル ビューから行を選択すると、いくつかのオプションを示す新しいテーブル ビューが表示されます。ユーザーが新しいテーブルビューから行を選択したら、テーブルを閉じて親ビューコントローラーを表示し、ユーザーの選択をセルに表示します。フォームのかなりのラジオ選択。

ビュー コントローラーの破棄を処理し、ビュー内のデータの受け渡しが表示されるか、インデックス パスで行を選択しましたか? 私はしばらくこれにこだわっています。

4

3 に答える 3

9

委任を使用します。子ビュー コントローラーは、親ビュー コントローラーが実装するデリゲート プロトコルを定義します。親View Controllerが子View Controllerを表示する前に、それ自体を子View Controllerのデリゲートとして設定します。ユーザーが子ビューで行または何かを選択すると、子ビュー コントローラーはそのデリゲートでメソッドを呼び出し、それ自体を閉じます。


サンプルコードを書きました: https://github.com/vikingosegundo/StateSelection

親ビュー コントローラーは MasterViewController です。
子ビュー コントローラーは StateSelectionViewController です。

  • StateSelectionViewController は、ヘッダーでプロトコルを定義しStateSelectionDelegate、デリゲート プロパティを持ちますid<StateSelectionDelegate> delegate

    @protocol StateSelectionDelegate <NSObject>
    -(void) selectedState:(NSString *)state forNation:(NSString *)nation;
    @end  
    
  • MasterViewController はこのプロトコルに準拠しており、唯一のデリゲート メソッドを実装していますselectedState:forNation:

    -(void)selectedState:(NSString *)state forNation:(NSString *)nation
    {
        self.statesDictionray[nation] = state;
        [self.tableView reloadData];
    }
    
  • MasterViewController の実行中prepareForSegue:に、StateSelectionViewController である目的のビュー コントローラーのデリゲートを自身に設定します。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"showDetail"]) {
            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
            NSString *selectedNation =[[[self.tableView cellForRowAtIndexPath:indexPath] textLabel] text];
            [[segue destinationViewController] setSelectedNation:selectedNation];
            [[segue destinationViewController] setDelegate:self];
        }
    }
    
  • これでセグエが実行され、StateSelectionViewController のテーブルビューが表示されます。

  • ユーザーが行の 1 つにタブを付けると、StateSelectionViewController が呼び出されます。

    [self.delegate selectedState: <theState> forNation: <theNation>];
    

    そして、それ自体を却下またはポップします。コントローラが提示された方法を決定するスイッチに注意してください。

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
           [self.delegate selectedState:stateDictionary[_selectedNation][indexPath.row] forNation:_selectedNation];
           if(self.presentingViewController)
               [self dismissViewControllerAnimated:NO completion:NULL];
           else
               [self.navigationController popViewControllerAnimated:YES];
    
    }
    
于 2013-09-25T17:09:57.280 に答える
1

Vikingosegundo の提案を拡張するには:

最初のビュー コントローラーが 2 番目のビュー コントローラーにセグエするときは、prepareForSegue メソッドを実装します。

2 番目のビュー コントローラーに、parentVC プロトコルに準拠するデリゲート プロパティを指定します。

現在選択されているテーブル ビュー セルについてデリゲートに通知できるメソッドを、parentVC プロトコルで定義します。

最初のビュー コントローラーの prepareForSegue メソッドで、自分自身を 2 番目のビュー コントローラーのデリゲートとして設定します。

ユーザーが 2 番目のビュー コントローラーのセルを変更した場合、delegate プロパティを使用して親ビュー コントローラーに通知します。

この正確な設定を示すサンプルアプリが github にあります。私は親/子ビュー コントローラーを使用し、セグエを埋め込むように設定されていますが、モーダル プレゼンテーション、ナビゲーション コントローラー ベースのナビゲーション、またはその他のさまざまなアプリ構造に同じアプローチを使用できます。

レポには「test」というまったく役に立たない名前が付いています。https://github.com/DuncanMC/testで入手できます。

于 2013-09-25T17:45:01.993 に答える