0

私のアプリには、3つのタブを持つUITabViewControllerがあります。最初の2つのタブは、ディスクからいくつかのデータを読み取り、それを表示します(最初の2つのタブのviewDidLoadで実行されます)。

3番目のタブには、ある種の構成情報があります。ユーザーが3番目のタブの構成情報を変更した場合、最初の2つのタブを更新する必要があります。つまり、viewDidLoadを再度呼び出す必要があります。

最初の2つのタブでviewWillAppearを使用することはできません。これは、ディスクからの読み取り部分が一種の集中的なものであり、タブがクリックされるたびにそれを実行したくないためです。また、3番目のタブデータを編集するときに(最初の2つのタブを更新することに加えて)いくつかの補助タスクを実行する必要があるため、これらの補助タスクを実行しながら、viewDidLoadを介してタブをリロードしたいと思います。

4

3 に答える 3

3

これを行うには、NSNotifications を使用します。

3 番目のタブは構成設定であるため、これらを保存する可能性が高いNSUserDefaultsため、 を使用してメソッドNSUserDefaultsDidChangeNotificationでこれを監視しviewDidLoad、reloadData コードを独自のメソッドに移動します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self
                           selector:@selector(userDefaultsChanged:)  
                               name:NSUserDefaultsDidChangeNotification
                             object:nil];

    [self reloadData];
}

userDefaultsChanged:これで、デフォルトが変更されるたびにメソッドの呼び出しがトリガーされます。次のようにメソッドを追加します。

- (void)userDefaultsChanged:(NSNotification *)notification
{
    [self reloadData];
}

- (void)viewDidUnload
{
    [super viewDidUnLoad];

    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

編集:特定のデフォルト値を監視する代替方法

[[NSUserDefaults standardUserDefaults] addObserver:self
                                        forKeyPath:@"SomeDefaultKey"
                                           options:NSKeyValueObservingOptionNew
                                           context:NULL];

- (void)observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context
{
    if([keyPath isEqual:@"SomeDefaultKey"])
    {
       // Do Something
    }
    if([keyPath isEqual:@"SomeOtherKey"])
    {
       // Do Something else
    }
}
于 2012-05-28T10:32:28.603 に答える
1

このメソッドを使用し-(void)viewWillAppear:(BOOL)animatedて、他の 2 つのビュー コントローラーで更新をトリガーできます。

ユーザーがタブをクリックするたびにデータをリロードしたくない場合は、NSNotifications を使用して更新をトリガーできます。詳細な説明については、http ://www.numbergrinder.com/2008/12/patterns-in-objective-c-observer-pattern/ を参照してください。

于 2012-05-28T10:02:05.717 に答える
1

私は使用します-(void)viewWillAppear:(BOOL)animated。ディスクからの読み取りが「一種の集中的」であることを回避するには、3番目のタブで構成が変更されたときにフラグを設定し、そのフラグが設定されている場合にのみ他のタブでディスクから読み取ることができます

于 2012-05-28T10:04:50.863 に答える