1

このオブザーバーはうまく機能します

[self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

しかし、これはエラーを生成します。

[self.tableView addObserver:self forKeyPath:@"contentOffset.y" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

 Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSConcreteValue 0x6e3eda0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key y.'

しかし、なぜ?

4

1 に答える 1

2

contentOffsetクラスのプロパティとして存在しますが、実際には a のインスタンスでありCGPoint、Objective-C クラスではなく通常の C 構造であるため、KVC に準拠していません。

2 番目の例では、Objective-C クラスのように扱っています。

アップデート

少し混乱するかもしれませんが、例に戻ります。

self.contentOffset       // contentOffset is a property of the current class
self.contentOffset.y     // y is a member of the CGPoint structure of which contentOffset is an instance

2 つは同じように見えますが、一方は Objective-C スタイルで、もう一方は C スタイルです。Cstructは Objective-C よりも古く、KVC を実装していません。Objective-C は C の上に構築されているため、C にあるものはすべて Objective-C でもありますが、その逆は当てはまりません。Objective-C クラス プロパティへのアクセスは、たまたま、構造体のメンバーへのアクセスと同じ構文を持っています。

おそらくサブクラス化UIScrollViewしており、適切なヘッダーファイルをチェックすると、おそらく次のようなものが表示されます

@property (nonatomic, assign) CGPoint contentOffset;

これassignは、C データ型であることを意味します。*また、ポインターを示す a がないことにも注意してください。

の宣言はCGPoint、それが Objective-C クラスではないことも確認します。

struct CGPoint {
  CGFloat x;
  CGFloat y;
};
typedef struct CGPoint CGPoint;

ご覧のとおり、CGPointは から派生したものではありませんNSObject

于 2012-08-23T09:50:14.033 に答える