如果我将代码用于在 HorizontalModal 的 viewDidLoad 方法中绘制后退按钮,则没有任何显示。但是,当我将相同的代码放在从 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
现在 的-viewDidLoad
方法HorizontalModal
将能够访问该backButton
属性,即使MyModal
更改了属性的值或覆盖了访问器。请记住,self
在两个版本中都指向完全相同的对象-viewDidLoad
,因此两个版本都可以访问相同的信息。