0

だから、私はこのチュートリアルに従いました: http://enroyed.com/ios/how-to-pass-data-between-ios-tab-bars-using-delegate/

そして、チュートリアルの最も重要な部分:

- (void)viewDidLoad
{
[super viewDidLoad];
   SecondViewController *svc = [self.tabBarController.viewControllers objectAtIndex:1];
svc.delegate = self; //important !! otherwise delegation will not work !
}

問題は、「viewWillLoad」に入れても、初期化する前にタブをクリックする必要があることです。タブをクリックする前にこれを指定するにはどうすればよいですか?

編集

3 つのタブのプロジェクトがあります。タブ 1 からタブ 2 へのリンク パス データでそのチュートリアルを使用しました。渡されたデータは、タブ 1 の Web ビューからタブ 2 の URL への URL です。最初のタブのリンクをクリックすると、URL が渡されます。

データは渡されますが、最初に 2 番目のタブを物理的にクリックしてから、最初のタブに戻ってリンクをクリックした場合に限ります。

したがって、上記のコードは、2 番目のタブを物理的にクリックした場合にのみ実行されるように見えます。

4

1 に答える 1

0

問題は、実際にタブ項目 2 に移動するまでsecondViewController完全に初期化されていないため、vc2 から vc1 に転送するデータがないことです。特に、secondViewControllerのビューはまだロードされていないため、スライダーから取得する値はまだありません。また、スライダーもありません。また、デリゲート メソッドをトリガーするために呼び出す IBAction メソッドもありません。実際、データ転送は VC2 でスライダーを動かしたときにのみトリガーされるため、vc2 に移動してスライダーを動かすまで起こらないことは明らかです。

リンク先の例では委任パターンを使用していますが、これは問題に対処するにはかなり貧弱な方法のようです。委任パターンは、委任者 (所有) と委任先 (所有者) の間に階層的な関係があるシナリオに最も適しています...常にではありませんが、最も一般的です。タブ バー コントローラーでは、この関係は、タブ バー コントローラー自体に対する親族の子関係に似ています。

達成したいことについて質問で十分な詳細を提供していませんが、これを考慮する必要があります。

tabBarController が読み込まれると、そのすべての子 viewController が初期化されますが、それらのビューは読み込まれません。

これは、これらのメソッドが呼び出されることを意味します。

//if loading from a xib or in code
- (id) initWithNibName:bundle

//if loading from a storyboard
- (id) initWithCoder:
- (void) awakeFromNib

ただし、関連するタブを実際に開かない限りビューがロードされないため、ビューのロード メソッド ( など) は呼び出されませviewDidLoadん。viewWillAppear

これを解決するには、初期化された変数を viewController2 (initメソッドの 1 つ) に配置し、vc1 のプロパティ構文を介してその変数にアクセスします。ただし、初期化された値を直接 vc1 に入れることもできます。各 VC が他の VC にどのように依存しているか、その依存関係を切り離す方法、および必要に応じて両方の VC がアクセスできる独立したデータ ソースを設定する方法についてよく考える必要があります。これは、モデル クラス、またはNSUserDefaults、またはあなたのプロパティである可能性がありますappDelegate...多くの可能な解決策のほんの一部です。

于 2013-04-13T02:33:01.290 に答える