2016-08-06 4 views
0

エクステンションを延長してクラスのプロパティを観察し、後でそのエクステンションを削除できるようにするにはどうすればよいですか?例えばスウィフトエクステンション内のKVO

私はUIViewのを持っている、と私は私のUIViewの拡張内のフレームの変更を聞きたいと思います。これらの変更が発生したら、新しいフレームに基づいてビューの外観を変更するコードを実行する必要があります。

私が抱えている問題は、オブザーバーを設定することができますが、私はそれを削除する方法を見つけることができないということです。 deinit()はありません。私は、UIViewのライフサイクルの間、オブザーバーがハングアップしたいと思います。

私はむしろ開発者にこの削除責任を負わせる必要はなく、サブクラス化したくありません。

KVOでなくても、もっと知りたい場合はKVOである必要はありません。

答えて

1

拡張機能は、クラスに新しい便利な初期化子を追加することができますが、彼らは クラスに新しい指定された初期化子またはdeinitializersを追加することはできませんが。 指定された初期化子および初期化子は、常に元のクラスの実装 によって提供されなければなりません。

だから私はあなたがサブクラス化せずにそれをうまく処理できないと思います。

2

これに対する通常の解決方法は、関連付けられたオブジェクトを割り当て解除スパイとして使用することです。関連付けられたオブジェクトは、添付オブジェクトの割り当てが解除されたときに解放されるため、添付オブジェクトが消えたときに起動するコードをdeinitで実行できます。つまり、マルチスレッドの世界でこれを本当にうまくやっているのは、一番少ないことを言うのはややこしいことです。私は自分の建物を作ることはお勧めしません。代わりに、あなたのためにこれを処理するPMKVObserverを提案します。自分でビルドすることを選択したとしても、PMKVObserverがその魔法をどのように実行するのかを調べて、あなたの実装ではあまりにも単純ではありません。

これはスウィフトではあまり難しくありませんが、実際にうまくいくためにはObjCで行い、Swiftにブリッジする方が良いです。ここでも、複雑なコーナーケースのコードを参照してください。

+0

私は本当にこれよりもはるかに簡単なことを望んでいました。 :( –

関連する問題