从超类访问子类属性

时间:2013-05-11 05:59:44

标签: ios objective-c cocoa-touch

我有一个扩展名为Horizo​​ntalModal的UIViewController的类,除其他外,我想在每个扩展它的视图上自动生成一个后退按钮。如果我将代码用于在Horizo​​ntalModal的viewDidLoad方法中绘制后退按钮,则不显示任何内容。但是,当我将相同的代码放在继承自Horizo​​ntalModal的类的viewDidLoad方法中时,该按钮显示正常。

E.g:

self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
[self.view addSubview:self.backButton];

在我看来,我遗漏了关于目标C中的类扩展和继承的内容。显然,Horizo​​ntalModal中的self.view和子类中的self.view指的是两个不同的东西。那么有没有办法将该方法保存在Horizo​​ntalModal类中,但是能够将后退按钮添加到子类视图中吗? IE,我可以从超类访问子类属性吗?或者是否有不同的方式(可能有类别)?

由于

1 个答案:

答案 0 :(得分:3)

  

如果我把代码放在viewDidLoad方法中绘制后退按钮   对于Horizo​​ntalModal,没有任何显示。但是,当我把相同的代码   在viewDidLoad方法中继承自的类   Horizo​​ntalModal,按钮显示正常。

听起来你的子类-viewDidLoad没有调用它的超类-viewDidLoad,如:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // subclass-specific view setup stuff here
}

这允许超类的-viewDidLoad版本首先执行它的操作,然后是子类需要做的任何事情。

  

我可以从超类访问子类属性吗?还是有一个   这样做的不同方式(可能有类别)?

如果超类需要一些每个子类都要提供的方法,那么你应该将该方法放在超类中,让子类覆盖它。通常,子类的方法实现调用超类的版本,但如果需要那么你应该记录这个事实。

对于属性也是如此:如果您的超类需要访问子类的某些属性(例如backButton),则超类应该定义该属性本身。然后子类可以自由地更改属性的值,甚至可以提供不同的属性访问器,并且使用该属性的超类中的代码将起作用。通常,超类不应该对其子类有任何了解。

所以,更具体一点,假设你有MyModalHorizontalModal的子类:

@interface HorizontalModal : UIViewController

@property(strong) UIView *backButton;

@end

@implementation HorizontalModal

- (void)viewDidLoad
{
    self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
    [self.view addSubview:self.backButton];
}

@end    

@interface MyModal : HorizontalModal
//...
@end

@implementation MyModal

- (void)viewDidLoad
{
    [super viewDidLoad];
    // more code specific to MyModal's view hierarchy
}

@end

现在,-viewDidLoad HorizontalModal方法将能够访问backButton属性,即使MyModal已更改属性值或覆盖了访问者。请记住,self指向-viewDidLoad两个版本中完全相同的对象,因此两个版本都可以访问相同的信息。