1

私は非常に複雑な状況にあります(私にとっては)解決しようとしていますが、これまでのところ問題があります。

ここで、アプリケーションの構造の概要を説明し、次に私が抱えている問題について説明します。私が使用している名前は、私が使用しているデータの機密性のために作成されています.

secondToLastViewController // is a UITableView on the navigation stack
lastViewController // is just a normal UIView that i want to push onto the navigation stack
RequestClass // this class dose requests to my database and passed the data back to correct classes
getInfoClass // class is used for this specific request stores the information correctly and passes it back to secondToLastViewController

したがって、ユーザーがsecondToLastViewController内でdidSelectRowAtIndexPathを開始すると、 RequestClassを使用してデータを要求します

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//..
[RequestClass Getinfo:storedInfoPram];
}

今、スレッドは私のRequestClassに向けて発射され、次に受信されたいくつかのデータについて DB にクエリを実行し、このデータは私のgetInfoClassに渡されます。これを行った理由は 、 RequestClass allさまざまなことを行うと、この特定のリクエストによって大量のデータが返され、正しいオブジェクト タイプに分類する必要があるため、それを行うためにこのクラスを作成しました。

とにかくgetInfoClass内ですべてを正しいタイプなどに並べ替え、このデータをrecivedDataというメソッドで secondToLastViewController に戻します。これは、問題が発生していると思う場所でもあります... secondToLastViewControllerの新しいインスタンスを作成すると、問題はありませんすでにスタック上にあり、元のリクエストの送信元であった同じsecondToLastViewControllerにデータを戻す方法を知っています。

- (void) recivedData {
// do some stuff then pass data back to secondToLastViewController

SecondToLastViewController *sec = [[SecondToLastViewController alloc] init];

    [sec sendGetSeriesArrays:pram1 Pram2:pram2 Pram3:pram3 Pram4:pram4 Pram5:pram5];

}

SecondToLastViewControllerに戻ると、スレッドはこのメソッドに到達します

- (void)sendGetSeriesArrays:pram1 Pram2:pram2 Pram3:pram3 Pram4:pram4 Pram5:pram5{

    // call detailed view onto the stack
    lastViewController *last = [[lastViewController alloc] initWithNibName:@"lastViewController" bundle:nil];

    [self.navigationController pushViewController:last animated:YES];
}

スレッドがこのポイントに到達した後、何も起こりません...すべてのデータがそこにあり、送信する準備ができていますが、新しいビューがコントローラースタックにプッシュされることはありません..内部getInfoClass

最初に知りたいのは、sendGetSeriesArrays で受信したデータを最終的なビューに渡す方法と、最後のビューをナビゲーション スタックにロードする方法です。

4

2 に答える 2

1

getInfoClass 内で secondToLastViewController インスタンスを再度作成しているという観察は正しいです。データを secondToLastViewController に戻すために デリゲート/プロトコルアプローチを使用する必要があることを好まないでください。

このよう
に getInfo クラスでプロトコルを定義します

getInfoClass.h

@protocol GetInfoClassProtocol <NSObject>

 //delegate method calling after getting data
 // I dont know the argument types give it properly 
 - (void)sendGetSeriesArrays:pram1 Pram2:pram2 Pram3:pram3 Pram4:pram4 Pram5:pram5; 

@end  

// declare the delegate property 

@property (assign, nonatomic)id<GetInfoClassProtocol>delegate;

getInfoClass.m

- (void) recivedData {
// do some stuff then pass data back to secondToLastViewController
    if ([self.delegate respondsToSelector:@selector(sendGetSeriesArrays: param2:)]) 
  {
     [self.delegate sendGetSeriesArrays:pram1 Pram2:pram2 Pram3:pram3 Pram4:pram4 Pram5:pram5];
  } 

}

secondToLastViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 //..
 RequestClass.delegate = self;
 [RequestClass Getinfo:storedInfoPram];
}

あなたの secondToLastViewController は、GetInfoClassProtocol

于 2013-05-15T04:30:40.583 に答える
0

これを実現する方法はたくさんあります。関数では、新しいインスタンスを作成するrevivedData代わりに、次のことができます。

1) でナビゲーション コントローラーへのポインターを維持するgetInfoClassと、ナビゲーション スタック上のビュー コントローラーから最後のビュー コントローラーを取得して使用できます。これは、View Controller のアクティブなインスタンスになります。ウィンドウ オブジェクトからこれを回復する方法はいくつかありますが、それらは壊れやすいように思われるため、その方法はお勧めしません。

2) 自分自身へのポインターをsecondToLastViewController自分のRequestClass getInfo呼び出しに渡し、それを保持して戻すことができます。すでに持っているコードの量によっては、これはおそらく苦痛です。

3) 複数の を持たない場合は、クラスの静的インスタンスを維持できますsecondToLastViewControllerObjective-C でクラスレベルのプロパティを宣言するにはどうすればよいですか? を参照してください。

于 2013-05-15T04:33:58.483 に答える