2

drawRect メソッドでクラス変数またはプロパティにアクセスしようとすると、奇妙な動作が見られます。

私の .h ファイルには次のものがあります

@interface DartBoard : UIView
{
    Board * board;
    int index;
}
@property (readwrite, assign, nonatomic) NSNumber * selectedIndex;
@end

私の.mファイルには次のものがあります

@implementation DartBoard

@synthesize selectedIndex;

-(id)init
{
    self.selectedIndex = [NSNumber numberWithInt:5];
    index = 123;
    return self;
}

- (void)drawRect:(CGRect)rect {
    NSLog(@"selectedIndex: %d",[self.selectedIndex intValue]);
    NSLog(@"index: %d",index);
}

@end

出力は

2012-06-12 19:48:42.579 App [3690:707] selectedIndex: 0
2012-06-12 19:48:42.580 App [3690:707] index: 0

私は解決策を見つけようとしてきましたが、運がありませんでした..

同様の質問を見つけましたが、問題に対する本当の答えはありませんでした

参照: UIView drawRect; スコープ外のクラス変数

drawRect は通常のメソッドとは異なり、クラスのスコープを正しく取得していないと感じていますが、どうすれば修正できますか?

乾杯ダミアン

4

1 に答える 1

5

drawRect は通常のメソッドとは異なり、クラスのスコープを正しく取得していないと感じています

いいえ、特別なことは何もありません-drawRect:

次の 2 つの可能性があります。

1.-initメソッドが呼び出されていません。

このビューがどのように作成されるかについては言及していませんでした -- 手動で を呼び出す[[DartBoard alloc] init]か、nib ファイルからアーカイブを解除するかです。

ニブからのものである場合、UIViewのアーカイブ解除では、メソッドを呼び出す必要があることがわかりませんinit。代わりに、指定されたイニシャライザを呼び出します-initWithFrame:

したがって、代わりにそのメソッドを実装し、必ず super! を呼び出す必要があります。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.selectedIndex = [NSNumber numberWithInt:5];
        index = 123;
    }
    return self;
}

2.ビューには2 つのインスタンスがある場合があります。1 つは手動でinit作成したもので、もう 1 つは別の場所 (おそらくペン先) から取得したものです。2 番目のインスタンスは、描画されているものです。その変数とプロパティは設定されないため、ゼロ (デフォルト値) として表示されます。

この行を-init-drawRect:メソッドの両方に追加して、 の値を確認できますself。(または、デバッガで確認してください。)

NSLog(@"self is %p", self);
于 2012-06-12T19:31:16.460 に答える