0

UIControl私のアプリケーション(UIButton、、UISliderなど)のすべてが、それらに追加する特別な追加のプロパティを持つようにしようとしています。

UIControlカテゴリを作成し、必要に応じてインポートすることでこれを達成しようとしましたが、問題があります。

これが私のコードです。

私のsetSpecialpropertyメソッドは呼び出されますが、アプリがクラッシュするまで無限ループで呼び出されているようです。

私が間違っていることを教えてもらえますか、または私のすべてにプロパティを追加するためのよりスマートな方法を提案できますUIControlsか?

@interface UIControl (MyControl)
{

}
@property(nonatomic,strong) MySpecialProperty  *specialproperty;

-(void)setSpecialproperty:(MySpecialProperty*)param;
@end

////////

#import "UIControl+MyControl.h"

@implementation UIControl (MyControl)

-(void)setSpecialproperty:(MySpecialProperty*)param
{
    self.specialproperty=param;
}

///////////////

#import "UIControl+MyControl.h"

@implementation ViewController


UIButton *abutton=[UIButton buttonWithType:UIButtonTypeCustom];
MySpecialProperty *prop=[MySpecialProperty alloc]init];
[abutton setSpecialproperty:prop];
4

4 に答える 4

2

カテゴリを介してUIControlにiVarを追加することはできませんが、関連付けられたオブジェクトを追加することはできます。これを使用して、ほぼ同じ機能を実行できます。

したがって、UIControlに次のようなカテゴリを作成します。

static char kControlNameKey;

- (void) setControlName: (NSString *) name
{
    objc_setAssociatedObject(self, &kControlNameKey, name, OBJC_ASSOCIATION_COPY);
}

- (NSString *) controlName
{
    return (NSString *)objc_getAssociatedObject(array, &kControlNameKey);
}

それだけではありません。新しい関連付けを設定する前に、関連付けが存在するかどうかを確認する必要があると思います。そうでない場合は、リークが発生しますが、これで開始できます。

詳細については、AppleDocsを参照してください

于 2013-02-26T12:23:42.753 に答える
1

self.specialproperty=param呼び出しとまったく同じです( Obj-Cドット表記の完全にバイアスのないカバレッジについてはここ[self setSpecialproperty]参照してください)。これにより、現在の使用法が無限に再帰的になります。

実際にやりたいことは次のとおりです。

-(void)setSpecialproperty:(MySpecialProperty*)param
{
  _specialproperty = param;
}

プロパティに対して_specialproperty暗黙的に作成されるのはどこですか。ivar

setSpecialpropertyセッターを実装した理由は何かあると思いますか?暗黙的に作成されたものを使用してみませんか?

于 2013-02-26T12:14:22.907 に答える
1

問題は、プロパティをカテゴリに追加できないこと、動作(メソッド)を追加できるが、プロパティや属性を追加できないことです。これは拡張機能に対してのみ実行でき、SDKクラスの拡張機能を作成することはできません。

于 2013-02-26T12:21:09.610 に答える
-1

あなたの方法を次のように使用します

メソッド名をに変更します

-(void)setSpecialproperty:(MySpecialProperty *)specialproperty

-(void)setSpecialproperty:(MySpecialProperty*)specialproperty
{
   if(_specialproperty!=specialproperty)
  _specialproperty = specialproperty;
}

そしてあなたのspecialPropertyをとして合成します

@synthesize specialproperty=_specialproperty;
于 2013-02-26T12:19:17.733 に答える