私の XCode 上のシングル ビュー アプリケーションには、iPhone の全画面の約半分のサイズのカスタム ビューがあります。カスタム ビュー内でのみ使用できる描画ツールを実装しました。カスタム ビューは、描画ツールが移動した距離を記録します。ViewController を 1 つだけ使用して、距離変数をカスタム ビュー フレームの外側の Label に表示したいと考えています。これを行うには、プロトコルとデリゲートを使用する必要がありますか? それとももっと簡単な方法がありますか?過去数日間、プロトコルとデリゲートの方法をテストしてきましたが、どこにも行きませんでした。
2 に答える
最初にインターフェイス ビルダーでカスタム ビューをメイン ビュー コントローラー ビューのサブビューとして追加し、ラベルも追加します。次に、ラベルとビューのアウトレットをView Controllerに追加します(それぞれdistanceLabelとdrawViewと呼びましょう)。
ここで、distanceDrawn をカスタム ビューのプロパティとして宣言し、ツールが移動されたときに、正しい数値を含むように更新します。
次に、View Controller の viewDidLoad に以下を追加します。
[drawView addObersver:self forKeyPath:@"distanceDrawn" options:NSKeyValueObservingOptionNew context:null]
また、コントローラーに追加します。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([object isEqual:drawView]) {
id distance = change[NSKeyValueChangeNewKey]; //change to appropriate type
distanceLabel.text = [NSString stringWithFormat:@"%@", distance];
}
}
これで、distanceDrawn を変更するたびに、このメソッドが呼び出され、change と呼ばれるディクショナリに、新しく設定された key の値が含まれますNSKeyValueChangeNewKey
。値を取得すると、ラベルを更新できます。
カスタム ビューには、図面の長さのプロパティが必要です。その後、カスタム ビューへの参照を持つ任意のクラスから値を読み取ることができます。
おそらく、描画の長さが長くなるたびにView Controllerにラベルを更新させたいと思うでしょう。Key-Value Observing でそれを処理できます。drawingLength プロパティが変更されたときに、カスタム ビュー オブジェクトからの通知を登録します。
デリゲートを使用してこれを行うことができます。場合によっては、それがよりクリーンなソリューションだと思います。カスタム ビューからリッスンできる更新の種類が明確になっていると便利です。ただし、この種のケースはまさに Key-Value Observing が意図しているものです。