3

iOS でのキー値の監視を理解しようとしていますが、何かが正しく行われていないと思います。アイデアとして、View Controller のプロパティ (IBOutlet に接続されたビュー) にオブザーバーを追加しようとしました。このビュー (tableIndicator) はアニメーション化されているため、ビューのフレームが変化したときにオブザーバーが反応するかどうかを確認したかったのです。

そこで、View Controller の viewDidLoad 内で次のことを行いました。

[tableInidicator addObserver:self forKeyPath:@"frame" options:0 context:nil];

tableIndicatorは私のビュー/クラス プロパティです。ビュー コントローラー (self) をオブザーバーとして追加し、デフォルト オプションとして 0 を追加し、観察されるキー値としてフレームを追加します。

次に、フレームが変化したときにこの関数がトリガーされるかどうかを確認するのを待っています。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    NSLog(@"value changed");
}

...しかし、何も起こりません。

このコードは、私が理解する以外の目的には役立たないため、必ずしもこのコードの修正を探しているわけではありません。誰かが私が間違っていることを指摘してくれたら本当にありがたいです。いくつかの良い例/チュートリアルも素晴らしいでしょう.

私が見つけたもの ( http://iphonedevelopment.blogspot.ro/2009/02/kvo-and-iphone-sdk.html / http://nachbaur.com/blog/back-to-basics-using-kvo ) はそのような場合は対象外です。それらは、クラス内の (カスタム) オブジェクトのプロパティではなく、そのプロパティの 1 つを監視するためにクラスに適用されるオブザーバーにすぎませんでした。

前もって感謝します

[編集]受け入れられた回答に対する私のコメントを見逃す人のために:

ビューの中心を変更しても、フレーム プロパティのオブザーバーは明らかにトリガーされません。フレーム自体を変更する必要があります。

4

2 に答える 2

1

IBOutletが正しく接続されていることを確認してください。おそらく、tableIndicatorivarがnilを指していることを確認してください。以下のこの単純なコードを考えてみてください、それは機能します。ウィンドウを作成し、その上に赤い四角を追加してから、フレーム変更の通知を受けるオブジェクトをKVOを使用して登録するだけです。最後に、ボタンをインスタンス化します。ボタンをタップするたびに、フレームのサイズが小さくなり、通知が正しくトリガーされます(デバッグコンソールにメッセージが表示されます)。したがって、コードを確認する必要があります。



#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize v = _v;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    self.v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    _v.backgroundColor=[UIColor redColor];
    [self.window addSubview:_v];

    UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    b.frame=CGRectMake(0, 300, 40, 10);
    [b setTitle:@"A" forState:UIControlStateNormal];
    [b addTarget:self action:@selector(changeFrame) forControlEvents:UIControlEventTouchUpInside];
    [_window addSubview:b];

    [_v addObserver:self forKeyPath:@"frame" options:0 context:NULL];

    return YES;
}

-(void)changeFrame {
    CGRect _f = self.v.frame;
    _f = CGRectInset(_f, 20, 20);
    _v.frame=_f;
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSLog(@"Observing...");
}
于 2012-06-01T08:08:56.860 に答える