访问超类的子类属性
我有一个扩展名为HorizontalModal的UIViewController的类,其中,我希望在每个视图上自动生成一个后退按钮,以扩展它。如果我将代码绘制在HorizontalModal的viewDidLoad
方法中的后退按钮,则不会显示任何内容。但是当我将相同的代码放在继承自HorizontalModal的类的viewDidLoad
方法中时,该按钮显示正常。访问超类的子类属性
E.g:
self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
[self.view addSubview:self.backButton];
在我看来,我失去了一些关于类扩展和继承客观C.显然self.view
在HorizontalModal和self.view
在子类指的是两个不同的东西。那么是否有办法在HorizontalModal类中保留该方法,但是能够将后退按钮添加到子类视图? IE,我可以从超类访问子类属性吗?或者有没有不同的方式来做到这一点(也许与类别)?
感谢
如果我把代码绘制在viewDidLoad方法 为HorizontalModal后退按钮,什么也不显示。但是当我将相同的代码 放在继承自 HorizontalModal的类的viewDidLoad方法中时,该按钮显示正常。
这听起来像你的子类的-viewDidLoad
不调用它的父类的-viewDidLoad
,如:
- (void)viewDidLoad
{
[super viewDidLoad];
// subclass-specific view setup stuff here
}
这使得超类的版本-viewDidLoad
首先做它的事,其次是无论子类需要做的。
我可以从超类访问子类属性吗?或者是否有一个不同的方式来做到这一点(可能与类别)?
如果超类需要每个子类都要提供的方法,那么应该将该方法放在超类中,并让子类重写它。通常,子类的方法实现调用超类的版本,但如果这是需要那么您应该记录该事实。
属性也是如此:如果您的超类需要访问子类的某些属性(例如backButton
),则超类应该自定义该属性。然后子类可以自由更改属性的值,甚至可以提供不同的属性访问器,并且使用该属性的超类中的代码将正常工作。一般来说,超类不应该知道任何关于它的子类。
所以,要更加具体,让我们说你有MyModal
的HorizontalModal
一个子类:
@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
中的完全相同的对象,因此两个版本都可以访问相同的信息。
哈,本来可以发誓我做到了,但我想我错过了它。谢谢。 – jraede 2013-05-11 15:15:29
视图控制器没有'-drawRect'方法,因为它们不是视图,也不绘制任何东西。也许你的意思是'HorizontalModal'扩展了'UIView'? – Caleb 2013-05-11 06:03:11
您是否偶然尝试实现可以使用NavigationController实现的功能,一旦推入了新的控制器,就会提供后退按钮以弹出到前一个控制器? – Anupdas 2013-05-11 06:05:12
对不起,意思是viewDidLoad。不,我不想使用内置的导航控制器,因为我没有完全控制UI(IE,我无法设计我想要的后退按钮样式,而且我也无法设计顶部酒吧我想如何)。无论如何,即使我这样做,我的问题是我如何设置超级和子类,使超级可以访问子类的视图。 – jraede 2013-05-11 06:06:24