0

そのため、現在、特定のケースが発生した場合にloginviewcontrollerの上にモーダルに表示されるtableviewcontrollerがあり、ユーザーがセルを押すと、タイトルが親View Controllerに渡される必要があります。

したがって、(A) 親 - メインビュー、(B) ログイン、(C) テーブルビューコントローラーの図...

C は、ナビゲーション スタックではなくモーダル スタックを介して、A の上にある B の上にあります。したがって、C には、これ以外の A への参照はありません。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self Login];
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

ユーザーがセルを押すと、ビューは (A) に直接移動するため、(C) から (A) に (B) をスキップします。これは私が望んでいたものです...しかし、問題は、(A)を再度インスタンス化することなく、データを(A)に渡す方法です。つまり、アプリの起動の最初に既にインスタンス化されており、ユーザーがまだログインしていない場合は (B) が (A) の上に表示されます。したがって、(A) は常に読み込まれますが、データを渡すにはどうすればよいですかそれに?

提供すべき情報がさらにある場合は、お知らせください。できるだけ早く編集します。

編集 これに関連するいくつかの質問を見ましたが、NSNotificationを使用しますか? それとも委任?両方を使用しようとしましたが、実際には機能しませんでした...以前に回答した委任に関する質問を参照して、委任ソリューションを実装しましたが、(A) で (C) をインスタンス化する必要があります。しかし、私はすでに (B) で (C) をインスタンス化しています。私が使用するつもりだったが使用しなかった委任ソリューションは次のとおりです。使用しようとした NSNotification ソリューションのリンクは次のとおりです。

これをviewDidLoadの親コントローラーに入れます

- (void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    [self makeCallbacks];
    // get register to fetch notification
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(yourNotificationHandler:)
                                                 name:@"MODELVIEW DISMISS" object:nil];
}

//Now create yourNotificationHandler: like this in parent class
-(void)yourNotificationHandler:(NSNotification *)notice{
    str = [notice object];

}

あなたの子クラスに以下を入れてください

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSLog(@"%@", cell.textLabel.text);
    // cell.textLabel.text logs this -> EDF ENRS
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MODELVIEW DISMISS" object:cell.textLabel.text];
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

ログに「str」(null) が出力されると

今問題は、後でviewWillAppearで通知の外でstrをログに記録すると、nullが返され続けることです.通知メソッド内でstrをログに記録すると、nullが返されるだけです...後でこれを理解しようとしますが、主な問題は、NSNotificationCenter を使用して解決したと思います。

4

2 に答える 2

2

NSNotificationCenter が機能しない背後にある問題は、それが viewDidAppear で宣言されていることにあります。viewWillAppearのように、画面が表示されるたびに、変更が行われた場所に表示され、書き込まれていることを確認してください。

次に、このviewWillAppearメソッドで、parentView に必要な変更を加えます。

また、通知が投稿されたときに、呼び出されたメソッド内の通知を必ず削除してください。

于 2013-07-26T12:10:24.270 に答える
1

ある時点でオブザーバーを削除しない限り、通知コードは機能するはずです。

委任も機能します。委任をインスタンスに渡すだけです (A は B に渡し、B は C に渡します)。

ブロックは別のオプションで、委任に似ていますが、プロトコルの代わりにブロック タイプを使用します。繰り返しますが、インスタンスを介して渡されます。


ブロックはおそらく最良の選択肢です。通知は、複数のアイテムがイベントに関心を持ち、それらのアイテムが必ずしもイベントのトリガーに関連付けられていない場合に使用する必要があります。つまり、通知は「最小コード オプション」です。

于 2013-07-24T22:56:22.410 に答える