ios - 从父类(super class)访问子类属性

标签 ios objective-c cocoa-touch

我有一个扩展 UIViewController 的类,称为 Horizo​​ntalModal,除其他外,我想在扩展它的每个 View 上自动生成一个后退按钮。如果我把绘制后退按钮的代码放在 viewDidLoad Horizo​​ntalModal 的方法,没有任何显示。但是当我将相同的代码放入 viewDidLoad从 Horizo​​ntalModal 继承的类的方法,按钮显示正常。

例如:

self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
[self.view addSubview:self.backButton];

在我看来,我在 Objective-C 中遗漏了一些关于类扩展和继承的内容。显然 self.view在 Horizo​​ntalModal 和 self.view在子类中指的是两个不同的东西。那么有没有办法将该方法保留在 Horizo​​ntalModal 类中,但能够将后退按钮添加到子类 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)不必知道它的子类的任何信息。

所以,更具体地说,假设你有 MyModalHorizontalModal 的子类:
@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/

相关文章:

ios - Swift 1.2 - 在 Xcode 6.3.2 和 Xcode 4 中找不到桥接头文件消息

iphone - 如何创建像UITableViewCell这样的TextField?

ios - UIView 和 UIViewController 设计模式

ios - 快速方向改变 IOS

ios - 使用第 3 方库将二进制文件提交给 Apple

ios - 使用 NSOutputStream 通过套接字发送数据的正确方法

iphone - iPhone SDK 如何在通讯录中创建联系人?

ios - 从 App Store 下载应用程序以用作备份/回滚

iOS9 和 initWithPattern 与 iPad Pro 导致重复背景

objective-c - 无需解锁对话框即可读取权限