3

我想从组件的现有类中限制某些属性。

这是示例代码,

UIButton *customBtn;
property (nonatomic, strong) UIButton *customBtn;
@synthesize customBtn;

这是我的实现,

customBtn= [UIButton buttonWithType:UIButtonTypeCustom];
 customBtn= setImage:[UIImage imageNamed"radio_button_noraml.png"] forState:UIControlStateNormal];
 customBtn= setImage:[UIImage imageNamed"radio_button_acitve.png"] forState:UIControlStateSelected];
 customBtn = CGRectMake(5, 30, 20, 20); notsupport = [[UILabel alloc]initWithFrame:CGRectMake(25, 30, 290, 20)];
 [customBtn addTargetelf actionselector(MyAction:) forControlEvents:UIControlEventTouchUpInside];
 [self.view addSubview:customBtn];

在我的视图控制器中,我可以使用 customBtn 访问 UIbutton 中的所有属性。

myClass.customBtn.backGroundcolor = [UIColor blackColor];

但我想限制按钮属性的访问,例如,我想访问属性背景颜色和 alpha 值,其余的属性我不想访问。

所以请帮帮我。

谢谢!

4

4 回答 4

1

在objective-c 中,所有方法都是公共的,而属性只不过是setter 和getter(方法)。
所以你不能限制现有的方法/属性。
即使您将其子类化,您也只能覆盖它。如果有人使用该方法,
您可以在此处添加。NSAssert

于 2012-12-27T13:11:09.707 回答
0

看来您需要一个自定义组件并覆盖所需的 getter。我不知道其他实现方式,也许其他会给你。

所以它不会是一个简单的@synthesize。

@synthesize 等效代码:

// .h
@property (nonatomic, retain) id ivar;

// .m
- (id)ivar {
    return ivar;
}

- (void)setIvar:(id)newValue {
    if (ivar != newValue) {  // this check is mandatory
        [ivar release];
        ivar = [newValue retain];
    }
}

现在在 - (id)ivar 中应该有一些限制。

于 2012-12-27T12:51:38.070 回答
0

这是 obj-c 中缺少的东西之一,因为我与 C++ 比较,继承模式是私有的、受保护的和公共的。

如果这些功能在这里,您的工作就完成了,但事实并非如此。

在目标 C 中,没有私有或公共。每件事都是公开的。您实际上无法在类接口中显示方法,但知道它存在的人仍然可以访问它。从另一个类继承的类是所有“超级”类方法/属性和它自己的方法/属性的总和(在 Objective-C 中,一个只能从一个类派生,使用公共模式。)

于 2012-12-27T13:17:00.593 回答
0

不要customBtn在控制器的头文件中声明该属性,而是只声明您想要公开公开的那些按钮属性的属性。例如,在MyController.h

@interface MyController : UIViewController
{
}

@property(nonatomic, copy) UIColor* customBtnBackgroundColor;

@end

请注意,您使用的属性属性与原始类的属性声明中的属性属性相同。在示例中,按钮的backgroundColor属性实际上是由UIView(not UIButton) 声明的,因此如果您查看,UIView.h您会看到该属性是使用属性声明的nonatomiccopy

接下来,您需要customBtn在控制器的实现文件中私下声明该属性。您还需要为您在头文件中公开的属性的 getter/setter 方法提供一个实现。getter/setter 方法只是将调用转发到实际的按钮对象。例如,在MyController.m

#import "MyController.h"

// Class extension with private methods and properties for MyController
@interface MyController()
  property (nonatomic, strong) UIButton* customBtn;
@end


@implementation MyController

  @synthesize customBtn;

  // Note: No need to synthesize customBtnBackgroundColor here because
  // you don't need an instance variable, and you are providing the
  // getter/setter implementation yourself.


  - (UIColor*) customBtnBackgroundColor
  {
    return self.customBtn.backgroundColor;
  }

  - (void) setCustomBtnBackgroundColor:(UIColor*)backgroundColor
  {
    self.customBtn.backgroundColor = backgroundColor;
  }

@end

正如其他人所写的那样,如果外面的人MyController知道某个属性customBtn存在,则仍然可以访问该属性。但是,重点应该是定义 的公共接口MyController,并且使用上面概述的解决方案,您已经完成了预期的工作。

于 2012-12-27T13:50:55.933 回答