我有一个扩展名为HorizontalModal的UIViewController的类,除其他外,我想在每个扩展它的视图上自动生成一个后退按钮。如果我将代码用于在HorizontalModal的viewDidLoad
方法中绘制后退按钮,则不显示任何内容。但是,当我将相同的代码放在继承自HorizontalModal的类的viewDidLoad
方法中时,该按钮显示正常。
E.g:
self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
[self.view addSubview:self.backButton];
在我看来,我遗漏了关于目标C中的类扩展和继承的内容。显然,HorizontalModal中的self.view
和子类中的self.view
指的是两个不同的东西。那么有没有办法将该方法保存在HorizontalModal类中,但是能够将后退按钮添加到子类视图中吗? IE,我可以从超类访问子类属性吗?或者是否有不同的方式(可能有类别)?
由于
答案 0 :(得分:3)
如果我把代码放在viewDidLoad方法中绘制后退按钮 对于HorizontalModal,没有任何显示。但是,当我把相同的代码 在viewDidLoad方法中继承自的类 HorizontalModal,按钮显示正常。
听起来你的子类-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
现在,-viewDidLoad
HorizontalModal
方法将能够访问backButton
属性,即使MyModal
已更改属性值或覆盖了访问者。请记住,self
指向-viewDidLoad
两个版本中完全相同的对象,因此两个版本都可以访问相同的信息。