1

最近これを読んだ:

ビュー コントローラ間でのデータの受け渡し

これは、2 つのコントローラー間の委任セットアップの概要を示しています。私が直面している問題は、コントローラー間にセグエがないことです。つまり、値が更新されたときにビューを変更したくありません。舞台裏で、値が実際に変更されたことを別のコントローラーに認識させたいだけです。

これは、上記のリンクから私がつまずいているステップです:

最後に行う必要があるのは、ViewControllerB をナビゲーション スタックにプッシュする前に、ViewControllerA がそのデリゲートであることを ViewControllerB に伝えることです。

ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; viewControllerB.delegate = self [[self navigationController] pushViewController:viewControllerB animation:YES];

私はペン先を使用していませんし、セグエの準備がデリゲートを配線する正しい場所だとは思いません。デリゲートを配線することになっている他の場所はありますか?

ここに私のコードがあります:SettingsVeiwController、ユーザーがリフレッシュレートフィールドを更新したときに別のコントローラーに知らせたいです。

#import <UIKit/UIKit.h>

@protocol SettingsViewControllerDelegate <NSObject>
-(void) didUpdateRefreshRate:(NSString *)refreshRate;
@end

@interface SettingsViewController : UITableViewController <UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField *refreshRateTextField;

@property (copy, nonatomic) NSNumber *refreshRate;

@property (weak, nonatomic) id <SettingsViewControllerDelegate> delegate;

@end

MainViewController、refreshRate が変更されたときに更新を取得したい、

@interface MainViewController ()

@end

@implementation MainViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void) didUpdateRefreshRate:(NSString *)refreshRate {
    NSLog(@"This was returned from SettingsViewController %@",refreshRate);
}

@end

MainViewController がデリゲートであることを SettingsViewController に伝えることを除いて、すべてが正しく機能するように設定されていると思います。

おそらく最も重要なのは、これがタブ付きアプリケーションであることです。MainViewController は 1 つのタブで、SettingsViewController は別のタブです。タブ付きアプリケーションを使用する場合、つまりタブ間で情報/データを渡す方法を設定するのに良い方法かもしれません。デリゲートを介して、それらをどこに配線するかを知る必要があるだけだと思います。

4

1 に答える 1

1

適切な場所は(のプレゼンテーションとは関係ないとMainViewController viewDidLoad仮定して) です。のインスタンスを取得し、そのデリゲートを に設定するだけです。MainViewControllerSettingsViewControllerSettingsViewControllerself

とは言っても、が のSettingsViewController後に表示されると仮定するので、 s ビューがロードされたときに のMainViewControllerインスタンスはSettingsViewController存在しません。MainViewControllerその場合、 のインスタンスを作成して提示する責任を持つコントローラは、それが行われたことSettingsViewControllerを伝えるために何かを行う必要がありますMainViewController。これに対する良い解決策は、相互結合を低く保ち、このクラスに の要件について教えないようにするため、通知ですMainViewController

独自の通知名を定義します。

#define SettingsViewControllerWasCreatedNotification @"SettingsViewControllerWasCreatedNotification"

MainViewControllerオブザーバーとしてセットアップ:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(settingViewControllerShown:)
                                                 name:SettingsViewControllerWasCreatedNotification
                                               object:nil];
}

が作成されたらSettingsViewController、通知を投稿します

[[NSNotificationCenter defaultCenter] postNotificationName:SettingsViewControllerWasCreatedNotification
                                                    object:settingsViewController];

新しい設定ビュー コントローラーがオブジェクトです。これで、MainViewControllerコールバックを受け取り、デリゲートとして自分自身を追加できます。

- (void)settingViewControllerShown:(NSNotification *)note
{
    SettingsViewController *settingsViewController = (SettingsViewController *)[note object];
    settingsViewController.delegate = self;
}
于 2013-05-20T18:39:15.253 に答える