1

これは基本的な質問のように思えるかもしれませんが、私はまだプロパティを把握しているので、ご容赦ください。

独自の描画を行うカスタム NSView サブクラスがあります。@propertyセッターtypedef enum用と人間が読める整数用の を使用して、さまざまなスタイルのサポートをセットアップしました。それはうまく機能しますがsetNeedsDisplay:YES、コントロールを手動で呼び出すか親ウィンドウのサイズを変更しない限り、スタイルを設定した後にビューは再描画されません。

[self setNeedsDisplay:YES]論理的には、解決策は単にクラスのメソッドでa を実行することだと思うでしょうがsetStyle:、私は一生、それを適切に実行する方法を理解できません。オーバーライドしようとするとsetStyle:、「書き込み可能なアトミック プロパティ 'style' は、合成されたゲッターとユーザー定義のセッターをペアにすることはできません」と不平を言うだけです。

この状況で何をすべきですか?

4

3 に答える 3

1

理想的には、実際のivar / storageをプライベートプロパティとして宣言してから、setterを手動で実装しsetStyle:ます。の実装ではsetStyle:、プライベートプロパティ/状態を設定し、更新を実行します。したがって、クライアントのインターフェイスからデータを抽象化するだけです。ivarを直接設定するなど、これにアプローチする方法は他にもあります。

したがって、実装は次の形式をとることがあります。

MONThing.h

@interface MONThing : NSObject

- (void)setStyle:(t_style)pStyle; // << the client's interface

@end

MONThing.m

@interface MONThing ()

@property (nonatomic, assign, readwrite) t_style userStyle; // << the actual storage

@end

@implementation MONThing

- (void)setStyle:(t_style)pStyle
{
    // validate parameter
    // set our data
    self.userStyle = pStyle;
    // perform effects
    [self setNeedsDisplay:true];
}

時間が経つにつれて、これを達成するための複数の方法を学び、いつ一方を他方よりも優先するかを学びます。

于 2012-09-10T00:27:42.407 に答える
1

独自のセッターを設定する場合は、@synthesizeと@propertyを使用しないでください。これらは、setterメソッドとgetterメソッドを自動的に作成するためのものです。インターフェイスファイルで変数を宣言するだけで十分です。

于 2012-09-10T00:28:09.423 に答える
1

この質問を見てください。他の質問からの回答をコピーするには:

@propertyをアトミックであると宣言する場合は、次のいずれかを実行します。

@dynamicまたは;を使用します @synthesizeを使用して、合成されたセッターとゲッターを保持します。セッターとゲッターの両方の手動実装を提供します(上記のディレクティブのいずれかを使用せずに)。

于 2012-09-10T00:28:18.623 に答える