4

私はKeyValueObservingを使って練習していますが、それは私にはよくわかりません。

スライダー(sldMoving)があり、移動すると、コンソールに「変更されました」と表示されているように見せかけます。それを行う方法は他にもありますが、私は学ぶのが得意です。

-(void)viewDidLoadでそれをうまく実装します:

[super viewDidLoad];
[self.sldMoving addObserver:self forKeyPath:@"self.sldMoving.value" options:NSKeyValueObservingOptionNew context:NULL];

およびobservaValueKeyPath内:

-(Void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object change: (NSDictionary *) change context: (void *) context {
 
  if ([keyPath isEqualToString:@"self.sldMoving.value"]) {
      NSLog(@"I Have change");

明らかに、私が書いたこのナンセンスは機能しません。

エラー:

2012-08-25 20:17:07.611例[3947:c07] *キャッチされなかった例外'NSUnknownKeyException'、理由:'[addObserver:forKeyPath:@ "sldMoving.value" options:0x101 context:0x0]が原因でアプリを終了しました「sldMoving」プロパティのKVC準拠ではないオブジェクトへ。*まずスローコールスタック:(0x136b022 0x1060cd6 0x1313a48 0x13139b9 0xadc84f 0xadeb0c 0xaddd3f 0xadc6fd 0x27ff 0x28aa1e 0x1e9401 0x1e9670 0x1e9836 0x1f072a 0x1c1596 0x1c2274 0x1d1183 0x1d1c38 0x1c5634 0x2177ef5 0x133f195 0x12a3ff2 0x12a28da 0x12a1d84 0x12a1c9b 0x1c1c65 0x1c3626 0x1efd 0x1e65)終了と呼ばれる例外をスローします

どうすればこれを解決できますか?

ありがとうございました。

(すみません、私の悪い英語)

4

3 に答える 3

2

なぜobserveValueForKeyPathを使用するのかはよくわかりませんが、以下のコード行を使用して、変更アクションをスライダーに簡単にアタッチできます。

[self.sliderElement addTarget:self action:@selector(didChange:) forControlEvents:UIControlEventValueChanged];
于 2012-08-25T18:34:36.227 に答える
1

学びたいことは理解できますが、おそらくコントローラー以外でやるべきでしょう。一般に、明示的に文書化されていない限り、UIKitはKVOをサポートしていません。

コントロールを監視する場合は、標準のコントロールアクションAPIを使用する必要があります。

ただし、エラーで何が起こっているのかを理解するのに役立つように...

このコードを試しています...

[self.sldMoving addObserver:self forKeyPath:@"self.sldMoving.value" options:NSKeyValueObservingOptionNew context:NULL];

これは大まかにこのようなものに変換されます...

「よ、、sldMovingオブザーバーオブジェクトを追加してほしい(self)。これで、オブザーバーはこのキーパスで何が起こるかを監視したいと考えていself.sldMoving.valueます。具体的には新しい変更です。」

したがって、sldMovingオブジェクトは自分自身の内部を調べて、そのキーパスが意味をなすかどうかを確認します。ただし、それは意味がないので、その例外を引き起こします。なぜそれが意味をなさないのですか?これらの名前はUISliderにとって意味がないため、パスにドリルダウンする方法はありません。

さて、これに変更した場合:

[self addObserver:self forKeyPath:@"sldMoving.value" options:NSKeyValueObservingOptionNew context:NULL];

少なくとも登録は成功します。その人はselfオブジェクトに話しかけ、それが何ができるかを観察したいと思ってsldMoving.valueいます。なぜなら、それはKVO準拠のsldMovingを持っているからです(sldMovingがKVO準拠であると仮定すると、それ以外のファンキーな方法を追加しない限り、そうなると確信しています。従来の方法)、およびそれがありvalueます。

または、これを行うこともできます...

[self.sldMoving addObserver:self forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL];

さて、KVOを使用する際に考慮すべき多くの落とし穴があるので、KVOプログラミングガイドを実際に読む必要があります:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOCompliance .html

さて、最初にスライダーをクリックしたときに観察された変化だけが表示されても驚かないでください。他のすべての値の変化を見逃してしまうからです...

于 2012-08-25T20:26:42.860 に答える
0

スウィフト5

これがスライダーのプロパティであると仮定します。

var sliderPlayer: UISlider! 

次のように値の変化を観察するためにアクションを追加します。

sliderPlayer.addTarget(self, action: #selector(sliderValueChanged(_:)), for: UIControl.Event.valueChanged)

メソッドは次のようになります。

@objc func sliderValueChanged(_ sender: UISlider)
{
    print(sender.value)
}
于 2020-11-24T13:40:25.023 に答える