0

こんにちは、iPhone 開発者の皆さん。

私は経験豊富なソフトウェア エンジニアですが、iPhone プラットフォームは初めてです。サブクラス化されたView Controllerの実装に成功し、View Controllerスタックで親/子ビューをプッシュおよびポップできます。ただし、オブジェクトが子View Controllerで編集されているときにView Controllerを更新しようとすると、問題が発生しました。何度も実験に失敗した後、これを行うのに最適な方法のように見えるキー値オブザーバー API を発見しました。次に、メイン/親View Controllerにオブザーバーを登録し、オブザーバーでビューをリロードする予定です。アイデアは、オブジェクトが子View Controllerで編集されると、これが起動されるということです。ただ、オブザーバーが登録されていないと思うのは、編集中のView Controllerで値が更新されていることがわかっているので(デバッガーで確認できます)、

助けてください!

以下にコード スニペットを示します。

観察中の物体。setvalue メッセージで呼び出されたときに値が設定されるため、これはキー値に準拠していると思います (以下の子ビュー コントローラーを参照)。

じ:

@interface X : NSObject <NSCoding> {
    NSString    *name;
...
@property (nonatomic, retain) NSString *name;

Xm:

@implementation X

@synthesize name;
...

メイン ビュー Controller.h:

@class X;

@interface XViewController : UITableViewController {
    X *x;
...

メイン ビュー Controller.m:

@implementation XViewController

@synthesize x;
...
- (void)viewDidLoad {
    ...
    [self.x addObserver:self
            forKeyPath: @"name"
            options:        (NSKeyValueObservingOptionNew |
                             NSKeyValueObservingOptionOld)
            context:nil];

    [super viewDidLoad];
}
...
- (void)observeValueForKeyPath:(NSString *)keyPath
                    ofObject:(id)object
                    change:(NSDictionary *)change
                    context:(void *)context
{
    if ([keyPath isEqual:@"name"]) {
        NSLog(@"Found change to X");
    [self.tableView reloadData];
    }

    [super observeValueForKeyPath:keyPath
           ofObject:object
           change:change
           context:context];
}

Child View Controller.m: (これにより、子View Controllerのオブジェクトの値が正しく設定されます)

[self.x setValue:[[tempValues objectForKey:key] text] forKey:@"name"];
4

2 に答える 2

0

キー値の監視はアプリケーションでうまく機能する場合がありますが、「主要な」View Controller 間の通信には通知センターを使用する方がよい場合があります。(「主要な」View Controller は、たとえば iPhone の全画面表示用のメイン コントローラーです。)

これにより、通信が発生したときに両方のView Controllerが引き続き存在することが保証されます。KVO は、共通のコンテキスト (単一のビュー コントローラーまたはモデル) 内で使用するように設計されているように思えます。

クラス X は KVC 準拠のようです。コードで @property を宣言するかどうかは示していませんが。私はあなたがそうすると仮定します。

なぜあなたはこれをやっている:

[self.X setValue:[[tempValues objectForKey:key] テキスト] forKey:@"名前"];

ではなく、子ビューコントローラーで:

self.name = [[tempValues objectForKey:key] テキスト];

(そして、上記の self.X のことを本当に意味していたのですか? self.X は self.x ではありません。)

もう 1 つの注意: -[observeValueForKeyPath: ofObject:change:context:] メソッドのスーパークラスを呼び出す必要はありません。

アンドリュー

于 2009-10-18T16:42:38.457 に答える