我有一个扩展 UIViewController 的类,称为 HorizontalModal,除其他外,我想在扩展它的每个 View 上自动生成一个后退按钮。如果我把绘制后退按钮的代码放在 viewDidLoad
HorizontalModal 的方法,没有任何显示。但是当我将相同的代码放入 viewDidLoad
从 HorizontalModal 继承的类的方法,按钮显示正常。
例如:
self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
[self.view addSubview:self.backButton];
在我看来,我在 Objective-C 中遗漏了一些关于类扩展和继承的内容。显然
self.view
在 HorizontalModal 和 self.view
在子类中指的是两个不同的东西。那么有没有办法将该方法保留在 HorizontalModal 类中,但能够将后退按钮添加到子类 View ? IE,我可以从父类(super class)访问子类属性吗?还是有不同的方法(可能有类别)?谢谢
最佳答案
If I put the code to draw the back button in the viewDidLoad method for HorizontalModal, nothing shows up. But when I put that same code in the viewDidLoad method for the class that inherits from HorizontalModal, the button shows up fine.
听起来像您的子类的
-viewDidLoad
不是称它为父类(super class)的-viewDidLoad
, 像:- (void)viewDidLoad
{
[super viewDidLoad];
// subclass-specific view setup stuff here
}
这允许
-viewDidLoad
的父类(super class)版本首先做它的事情,然后是子类需要做的任何事情。can I access a sub-class property from a super class? Or is there a different way of doing this (maybe with categories)?
如果父类(super class)需要每个子类都应该提供的方法,那么您应该将该方法放在父类(super class)中并让子类覆盖它。通常,方法的子类实现调用父类(super class)的版本,但如果需要,那么您应该记录该事实。
属性也是如此:如果您的父类(super class)需要访问子类的某些属性(例如
backButton
),则父类(super class)应自行定义该属性。然后子类可以自由地更改属性的值,甚至提供不同的属性访问器,并且使用该属性的父类(super class)中的代码将正常工作。一般来说,父类(super class)不必知道它的子类的任何信息。所以,更具体地说,假设你有
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
属性(property),即使 MyModal
已更改属性的值或覆盖了访问器。请记住 self
在 -viewDidLoad
的两个版本中指向完全相同的对象,因此两个版本都可以访问相同的信息。
关于ios - 从父类(super class)访问子类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16494283/