0

KVO でコア データ値を監視していますが、オブザーバーを削除すると、次のメッセージが表示されます。

オブザーバーとして登録されていないため、キー パス "flightname.value" のオブザーバーを削除できません。

以下のコードは 2 回呼び出されます。初めて _selectedFlight が null であるため、removeObserver はトリガーされません。2 回目に削除したいのは、最初に割り当てられたものです。オブザーバー アドレスは変更されません。

//Remove old binding.
if (_selectedFlight) {
    id oi = [_selectedFlight observationInfo];
    if (![oi isFault]) {
        //NOTE: In somehow I cant remove it.
        [_selectedFlight removeObserver:self forKeyPath:@"flightname.value"];
    }
}

_selectedFlight = [_selectedRegistration.flights objectAtIndex:(_selectedRegistration.flights.count - indexPath.row - 1)];

//Bind flightname to the Summary View.
[_selectedFlight addObserver:self forKeyPath:@"flightname.value" options:0 context:NULL];

ここでは、removeObserver が呼び出される前に、observationInfo の内容といくつかの詳細を確認できます。

(lldb) po oi (id) $1 = 0x06b42d80 (コンテキスト: 0x0, プロパティ: 0x6b425e0> )

(lldb) po self (MenuViewController *const) $2 = 0x08136f90

(lldb) po _selectedFlight (フライト *) $3 = 0x06b26770 (エンティティ: フライト; id: 0x6b26ef0 ; データ: { 日付 = "0x6b1b8f0 "; 宛先 = "0x6b29140 "; フライト名 = "0x6b29150 "; id = 1; ladc = nil; loadsheet = nil; origin = "0x6b29160"; registration = "0x6e60700"; sta = "0xc81fb90"; std = "0xc8203d0"; todc = "0x6b293e0"; })

4

1 に答える 1

0

私はレガシーコードでこの問題を通り過ぎていましたが、次のことを行います。

 if (object && object.observationInfo)
    [object removeObserver:self forKeyPath:@"key"];

私のコードはレガシであるため、この問題の原因はわかりませんが、observationInfo プロパティをチェックすると問題が解決することがわかりました。

希望が役立ちます。

于 2014-06-16T16:13:47.200 に答える