对这个真正基本的问题表示歉意,但是在我的书和在线教程中,我找不到如何对自定义视图控制器进行子类化的示例-到底需要写下什么以及从继承中可以得到什么。根据其他语言的经验,我认为我可以从子类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


如果有人可以向我指出可以完全说明这一点的资源,我将非常感激。我确定它在文档中,但我找不到它。

最佳答案

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


如果在SignupViewController.m中声明了属性,则SignupViewController.m之外的所有代码将看不到它们。这是有意的,也是最常用的声明属性的方法。

如果希望它们公开,则必须在SignupViewController.h中声明属性,然后将其从.m文件中删除。

.m文件中的任何内容仅可从该文件中获得,如果您希望在其他位置使用它,则必须将其放在.h文件中并导入.h文件。如今,这已不是一种通用的编程语言功能,但是在较旧的编程语言中(并且Obj-C已有30年的历史了),通常这就是所有语言的工作方式。

10-04 11:24