2

私はiOSプログラミングに比較的慣れていないので、ここで我慢してください。私が取り組んでいる要件は次のとおりです。

画面 1:データ (具体的には City と State) がロードされた UITableView がユーザーに表示されます。ユーザーが選択をタップすると、画面 2 が表示されます。

画面 2:編集のために選択した項目の「詳細」ビューがユーザーに表示されます。

  • City 文字列 ( selectedCity ) は、編集のためにテキスト ボックスに配置されます。
  • 状態の NSArray は UITableView にロードされます。選択した都市の州は、画面 1 ( selectedState )から渡された文字列に基づいて、ロード時にテーブルで選択する必要があります。必要に応じて、ユーザーはここで別の状態を選択できます。
  • 2 番目の UITableView には、都市に関連し、データベースから取得された学校の配列が含まれます。このリストを管理するための別の機能セットがあります。

画面 1 の実装に問題はありませんでした。都市と州の値を画面 2 に渡す方法は次のとおりです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    //Get the City
    self.checkedCellIndex = indexPath.row;
    FSCity *selectedCity = [CityList objectAtIndex:indexPath.row];
    NSString *cityName = selectedCity.name;
    NSString *stateName = selectedCity.state;

    AdminCityView *dvController = [[AdminCityView alloc] initWithNibName:@"AdminCityView" bundle:[NSBundle mainBundle]];
    dvController.selectedCity = cityName;
    dvController.selectedState = stateName;

    [self.navigationController pushViewController:dvController animated:YES];

    dvController = nil;
}

ただし、Screen 2 をビルドするには、UITableView (StateTable と SchoolTable) ごとに UITableViewControllers を作成し、次のようにメインの UIViewController (AdminCityView) にロードする必要がありました。

- (void)viewDidLoad
{
    [super viewDidLoad];

    txtCity.text = selectedCity;

    if (stateController == nil) {
        stateController = [[StateTable alloc] init];
    }
    if (schoolController == nil) {
        schoolController = [[SchoolTable alloc] init];
    }
    [tblState setDataSource:stateController];
    [tblSchool setDataSource:schoolController];

    [tblState setDelegate:stateController];
    [tblSchool setDelegate:schoolController];
    stateController.view = stateController.tableView;
    schoolController.view = schoolController.tableView; 
}

UIViewController で selectedState 変数を問題なく取得でき、State テーブルが UIView で問題なく読み込まれますが、selectedState 変数を UIViewController (AdminCityView) から UITableViewController (StateTable) に渡す方法に行き詰っています。変数を使用して StateTable に対して操作を実行できます (変数に一致する行の選択など)。

私は AdminCityView と StateTable の両方で NSLog をテストしてきましたが、変数は現在 AdminCityView からしかアクセスできません。AdminCityView のコードを介して渡す必要があるのか​​、または AdminCityView に移動する前に、画面 1 に戻って何らかの方法で StateTable に渡す必要があるのか​​がわかりません。

答えにたどり着くのに役立つかもしれない追加のコードを投稿できてうれしいです。ありがとう!

4

1 に答える 1

1

これを行うには 3 つの方法があります。

ストーリーボードを使用している場合は、セグエを使用するだけで完了できます。viewController:initWithNibName は不要になるため、コードからはそうではないと推測できます。

だからあなたは昔ながらのやり方に固執していて、時にはそれが最善であることが判明することもあります...

NSNotificationCenter 経由で通知を使用できます。を使用して、stateTable を notificationCenter にサブスクライブします。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethodToCall:) name:@"someName" object:nil];

ここで、observer は self である必要があり、selector は通知の送信時に呼び出される実装する必要があるメソッド (必要に応じてハット名を選択できます)、name は通知の名前 (好きなように選択)、object は通知を受け取りたいオブジェクト (多くの通知を送信しない限り、おそらくこれを指定する必要はありません)。

また、次のように -(void)someMethodToCall: を実装する必要があります。

-(void)someMethodToCall:(NSNotification *)notification{
    NSDictionary *dic = notification.userInfo;
    //you will store all the data you want transferred in this, as you will see.
    //use it as you like
}

AdminCityView はメッセージを stateTable に送信できるようになり、それらはペイロードを運ぶことができます。あなたがする必要があるのは次のとおりです。

[self postNotificationName:@"theNameYouChoseAbove" object:yourFirstViewController  userInfo:someDictionaryThatHoldsYourValues];

AdminCityView からのデータが NSDictionary に転送されるようになりました。それらは彼らが受け入れるものについて本当にオープンマインドなので、あなたは大丈夫なはずです.

別の方法は、プロトコルを使用することです。

次のように AdminCityView でプロトコルを実装できます。

@protocol yourNameHereProtocol
-(void)methodToCall:(NSString*)theData;
@end

ヘッダーファイルのインターフェースの上でそれを行うだけで、あなたに合ったタイプのデータを使用できます。NSString は単なる例です。

ここで、stateController はそのプロトコルに準拠する必要があります。stateController.h で、これをインターフェイスの後ろに追加します。

@interface stateController (UIViewController)<yourNameHereProtocol>{
}
-(void)someMethodToCall:(NSString *)theData;

ここで、stateController は someMethodToCall を実装する必要があります。

dvController を作成したら、次のようにします。

[dvController setDelegate:stateController];

これで、dvController は、stateController でデリゲート メソッド someMthodToCall:data を呼び出し、data 属性を介してデータを送信できます。

ああ、本当に 2 つの TableViewController は必要ありません。周囲のビューを UITableViewDataSource および TableViewDelegate プロトコルに準拠させ、デリゲート メソッドでさまざまなケースをすべて処理できます。しかし、それは別の投稿のためだと思います。

ご不明な点がございましたら、これにコメントしてください。できる限りお答えします。また、異なるクラスなどの分母を混同している可能性がありますが、合理的と思われるので自由に変更してください。

楽しむ

于 2013-01-16T21:41:06.143 に答える