0

CGRectのプロパティを関連付けられたオブジェクトとして作成しようとしているUIButtonので、このためだけにサブクラス化する必要はありませんUIButton

基本的に、というタイトルのプロパティを追加していますが、tapArea作成に問題があります。これは私がこれまでに持っているものです:

@dynamic tapArea;

- (void)setTapArea:(CGRect)tapArea {
    objc_setAssociatedObject(self, @selector(tapArea), [NSValue valueWithCGRect:tapArea], OBJC_ASSOCIATION_ASSIGN);
}

- (CGRect)tapArea {
    return [objc_getAssociatedObject(self, @selector(tapArea)) CGRectValue];
}

NSLogが言うdogButton.tapAreaと、ロガー{{0,0},{0,0}}は理にかなっています。設定しようとすると問題が発生します。次のクラッシュが発生します。

-[__NSCFString CGRectValue]: unrecognized selector sent to instance 0x14e65e80

NSValue を使用しているため、このエラーが発生していると思いますが、正しく引き戻していません。ゲッターを修正するにはどうすればよいですか?

PSこれは、カテゴリヘッダーファイルでプロパティを宣言する方法です:

@property (nonatomic, assign) CGRect tapArea;

また、プロパティをデフォルトではなくボタンのフレームに等しく設定するにはどうすればよい{{0, 0}, {0, 0}}ですか?

4

1 に答える 1

3

UIButton のサブクラス化を回避するために非常に懸命に取り組んでいますが、これは非常に簡単で迅速です。必要以上に複雑にしないでください。

また、NSValue は、割り当てずに保持する必要がある NSObject です。ストレージ セマンティックが正しくないため、問題が発生している可能性があります。関連するオブジェクトはオブジェクトであり、オブジェクトのように保持する必要があります。

使用するOBJC_ASSOCIATION_RETAIN_NONATOMIC

于 2015-02-08T09:51:43.207 に答える