1

我有一个扩展 UIViewController 的类,称为 Horizo​​ntalModal,除其他外,我想在扩展它的每个视图上自动生成一个后退按钮。如果我将代码用于在 Horizo ​​ntalModal 的viewDidLoad方法中绘制后退按钮,则不会显示任何内容。但是,当我将相同的代码放在viewDidLoad从 Horizo​​ntalModal 继承的类的方法中时,按钮显示得很好。

例如:

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,我可以从超类访问子类属性吗?还是有不同的方法(可能有类别)?

谢谢

4

1 回答 1

3

如果我将代码用于在 Horizo​​ntalModal 的 viewDidLoad 方法中绘制后退按钮,则没有任何显示。但是,当我将相同的代码放在从 Horizo​​ntalModal 继承的类的 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,因此两个版本都可以访问相同的信息。

于 2013-05-11T06:09:48.937 回答