2013-02-26 3 views
0

내 응용 프로그램 (UIButton, UISlider 등)의 모든 단일 UIControl에 모든 특수 추가 속성이 추가되도록하기 위해 노력하고 있습니다.내 모든 UIControls에 속성 추가

UIControl 카테고리를 생성하고 필요한 경우 가져 오기를 시도했지만 문제가 있습니다.

여기 내 코드입니다.

setSpecialproperty 메서드가 호출되지만 응용 프로그램이 중단 될 때까지 무한 루프에서 호출되는 것 같습니다.

Im이 잘못한 것을 나에게 알려주거나 내 UIControls에 재산을 추가하는 더 똑똑한 방법을 제안 할 수 있습니까? ///////////////

#import "UIControl+MyControl.h" 

@implementation ViewController 


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

Apple Docs를 참조하십시오. 컴파일러는 이미 당신을 위해 그렇게합니다. 그냥 부르세요! – CainaSouza

답변

2

범주를 통해 UIControl에 iVar을 추가 할 수는 없지만 동일한 기능을 수행하는 데 사용할 수있는 Associated Objects를 추가 할 수 있습니다.

static char kControlNameKey; 

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

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

그것보다 더있다, 난 당신이 협회는 새로운 하나를 설정하기 전에 존재하는지 확인해야 겠네요, 그렇지 않으면 누출 :

그래서,이 같은 UIControl의 범주를 만들 , 그러나 이것은 당신에게 시작을 제공해야합니다.

당신은 setter 메소드를 만들 필요가 없습니다 자세한 내용

+0

ObjC runtime FTW! – dubbeat

1

self.specialproperty=param

@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; 
} 

정확히 동일하다 [self setSpecialproperty]을 호출하십시오 (에 대해서는 을 참조하십시오). 현재 사용법을 무한 재귀 적으로 만드는 데는 Obj-C 점 표기법의 범위가 적용됩니다.

당신이 실제로하고 싶은 것은 : _specialproperty는 암시 적 속성에 대한 ivar을 만들어

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

.

setSpecialproperty 설정기를 구현 한 이유가 있다고 가정하고 있습니까? 암묵적으로 만들어지는 것을 사용하지 않는 것이 어떻습니까?

-1

-(void)setSpecialproperty:(MySpecialProperty *)specialproperty 

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

에 메소드 이름을 변경하고 문제가이 범주에 속성을 추가 할 수 없다는 것입니다

@synthesize specialproperty=_specialproperty; 
+0

버전 5.1 이상을 사용하는 경우 Xcode 4.4 : http://stackoverflow.com/questions/12933785/ios-automatic-synthesize-without-creating-an-ivar – sjwarner

+0

필요하지 않으므로 속성을 종합하는 것은 꼭 필요한 것은 아닙니다. – Warewolf

1

로 specialProperty을 합성

로 방법을 사용, 비헤이비어 (메서드)를 추가 할 수는 있지만 속성이나 속성은 추가 할 수 없으며 확장에만 적용 할 수 있으며 SDK 클래스의 확장을 만들 수 없습니다.

+0

그래서 무슨 짓하려고하는 건 불가능한거야? – dubbeat

+0

당신이 그것을하려고하는 길은 가능합니다 @ VineetSinghRawat는 약간 복잡한 것처럼 보일 수 있지만 옵션이 아닙니다. 그냥 신중하게 읽으십시오 – tkanzakic

+1

[http : // www .cocoanetics.com/2012/06/associated-objects /)은 Apple Doc보다 더 읽기 쉽습니다 * – tkanzakic