访问超类的子类属性

问题描述:

我有一个扩展名为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.显然self.view在Horizo​​ntalModal和self.view在子类指的是两个不同的东西。那么是否有办法在Horizo​​ntalModal类中保留该方法,但是能够将后退按钮添加到子类视图? IE,我可以从超类访问子类属性吗?或者有没有不同的方式来做到这一点(也许与类别)?

感谢

+0

视图控制器没有'-drawRect'方法,因为它们不是视图,也不绘制任何东西。也许你的意思是'Horizo​​ntalModal'扩展了'UIView'? – Caleb 2013-05-11 06:03:11

+0

您是否偶然尝试实现可以​​使用NavigationController实现的功能,一旦推入了新的控制器,就会提供后退按钮以弹出到前一个控制器? – Anupdas 2013-05-11 06:05:12

+0

对不起,意思是viewDidLoad。不,我不想使用内置的导航控制器,因为我没有完全控制UI(IE,我无法设计我想要的后退按钮样式,而且我也无法设计顶部酒吧我想如何)。无论如何,即使我这样做,我的问题是我如何设置超级和子类,使超级可以访问子类的视图。 – jraede 2013-05-11 06:06:24

如果我把代码绘制在viewDidLoad方法 为Horizo​​ntalModal后退按钮,什么也不显示。但是当我将相同的代码 放在继承自 Horizo​​ntalModal的类的viewDidLoad方法中时,该按钮显示正常。

这听起来像你的子类的-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 

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

+0

哈,本来可以发誓我做到了,但我想我错过了它。谢谢。 – jraede 2013-05-11 15:15:29