子类化自定义UIViewController的工作原理是什么?

时间:2015-04-21 20:57:29

标签: ios objective-c subclassing

对这个非常基本的问题抱歉,但在我的书籍和在线教程中,我找不到如何子类化自定义视图控制器的示例 - 究竟要写下什么以及我们可以从继承获得什么。基于其他语言的经验,我认为我将从子类UIViewController中的父类中获取所有内容,而无需重新编码。我以为我可以修改我想要修改的功能,但似乎并非如此。我在下面尝试的描述:

我已经有一个名为SignupViewController的客户UIViewController。现在我想添加一个用户可以更新她的信息的视图,我意识到它基本上是一个SignupViewController的翻版,除了一些UITextFields隐藏和所有UITextFields预先填充现有信息。我认为我可以继承我的子类普通UIViewController的方式,但我发现当我尝试覆盖SignupViewController的新子类中名为UpdateViewController的SignupViewController中的方法时,我被告知找不到属性。它几乎感觉好像我正在处理一个空白文件,并且没有引用SignupViewcontroller的属性。例如,我正在尝试剔除字段,所以我在UpdateViewController中修改此代码:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    CGFloat lineHeight = .05*_height;

    if (textField == self.firstName) {
        [textField resignFirstResponder];
        [self.lastName becomeFirstResponder];
    } else if (textField == self.lastName) {
        [textField resignFirstResponder];
        [self.emailAddress becomeFirstResponder];
        [self.scrollView setContentOffset: CGPointMake(0, lineHeight)animated:YES];
    } ...etc...
    }

    return YES;
}

但是我收到的错误是UpdateViewController(继承自SignupViewController)没有scrollView,emailAddress,firstName,lastName等属性。我是否必须重新声明所有这些属性/写出所有内容?如果是这样,子类化究竟意味着什么?

这是SignupViewController的子类的.h和.m文件的样子: 。H     #import“SignupViewController.h”

@interface UpdateViewController : SignupViewController

@end

的.m

#import "UpdateViewController.h"

@interface UpdateViewController ()

@end

@implementation UpdateViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    CGFloat lineHeight = .05*_height;

    if (textField == self.firstName) {
        [textField resignFirstResponder];
        [self.lastName becomeFirstResponder];
    } else if (textField == self.lastName) {
        [textField resignFirstResponder];
        [self.emailAddress becomeFirstResponder];
        [self.scrollView setContentOffset: CGPointMake(0, lineHeight)animated:YES];
    } ...

    return YES;
}

@end

如果有人能指出我的资源,那就完全拼出来了,我真的很感激。我确定它在文档中,但我找不到它。

1 个答案:

答案 0 :(得分:3)

  

我收到的错误是UpdateViewController(继承自SignupViewController)没有scrollView,emailAddress,firstName,lastName等属性。我是否必须重新声明所有这些属性/写出所有内容?

如果属性是在SignupViewController.m中声明的,那么它们对SignupViewController.m外的所有代码都是不可见的。这是故意的,也是最常见的声明属性的方式。

如果您希望它们是公共的,则必须在SignupViewController.h中声明属性,并将它们从.m文件中删除。

.m文件中的任何内容仅在该文件中可用,如果您希望在其他地方可用,则必须将其放在.h文件中并导入.h文件。它现在不是一种常见的编程语言功能,但是在较旧的编程语言中(Obj-C已接近30年),通常它们都是如何工作的。