自定义 UIViewController 的子类化到底是如何工作的?
how exactly does subclassing a custom UIViewController work?
对于这个非常基本的问题深表歉意,但在我的书籍和在线教程中我找不到如何子class 自定义视图控制器的示例 - 究竟需要写下什么以及我们可以获得什么从继承。根据其他语言的经验,我认为我可以在子 class 的 UIViewController 中从父 class 获得所有内容,而无需重新编码。我以为我可以只修改我想修改的功能,但事实并非如此。我在下面尝试的描述:
我已经有一个名为 SignupViewController 的客户 UIViewController
。现在我想添加一个视图,用户可以在其中更新她的信息,我意识到它基本上是 SignupViewController 的翻版,除了隐藏了一些 UITextFields
并且所有 UITextFields
都预先填充了现有信息。我以为我可以 subclass 像我将 subclass 一个普通的 UIViewController
那样,但是我发现当我尝试在新的 subclass 中覆盖 SignupViewController 中的方法时SignupViewController 称为 UpdateViewController,我被告知找不到属性。感觉好像我正在处理一个空白文件,并且没有引用 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 等 属性。我是否必须重新声明所有这些 properties/write 一切?如果是这样,subclassing 的真正含义是什么?
SignupViewController 的 subclass 的 .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
如果有人能给我指出一个资源来说明这一切,我将不胜感激。我确定它在文档中,但我找不到它。
I am getting errors that UpdateViewController (inheriting from SignupViewController) has no scrollView, emailAddress, firstName, lastName, etc property. Do I have to redeclare all these properties/write everything out?
如果属性在 SignupViewController.m 中声明,那么它们对 SignupViewController.m 之外的所有代码都是不可见的。这是有意的,也是最常用的属性声明方式。
如果您希望它们是 public,您必须在 SignupViewController.h 中声明属性,并将它们从 .m 文件中删除。
.m 文件中的任何内容只能在该文件中使用,如果您希望它在其他地方可用,您必须将其放入 .h 文件中并导入 .h 文件。这不是今天常见的编程语言功能,但在较旧的编程语言中(Obj-C 已接近 30 年)通常都是它们的工作方式。
对于这个非常基本的问题深表歉意,但在我的书籍和在线教程中我找不到如何子class 自定义视图控制器的示例 - 究竟需要写下什么以及我们可以获得什么从继承。根据其他语言的经验,我认为我可以在子 class 的 UIViewController 中从父 class 获得所有内容,而无需重新编码。我以为我可以只修改我想修改的功能,但事实并非如此。我在下面尝试的描述:
我已经有一个名为 SignupViewController 的客户 UIViewController
。现在我想添加一个视图,用户可以在其中更新她的信息,我意识到它基本上是 SignupViewController 的翻版,除了隐藏了一些 UITextFields
并且所有 UITextFields
都预先填充了现有信息。我以为我可以 subclass 像我将 subclass 一个普通的 UIViewController
那样,但是我发现当我尝试在新的 subclass 中覆盖 SignupViewController 中的方法时SignupViewController 称为 UpdateViewController,我被告知找不到属性。感觉好像我正在处理一个空白文件,并且没有引用 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 等 属性。我是否必须重新声明所有这些 properties/write 一切?如果是这样,subclassing 的真正含义是什么?
SignupViewController 的 subclass 的 .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
如果有人能给我指出一个资源来说明这一切,我将不胜感激。我确定它在文档中,但我找不到它。
I am getting errors that UpdateViewController (inheriting from SignupViewController) has no scrollView, emailAddress, firstName, lastName, etc property. Do I have to redeclare all these properties/write everything out?
如果属性在 SignupViewController.m 中声明,那么它们对 SignupViewController.m 之外的所有代码都是不可见的。这是有意的,也是最常用的属性声明方式。
如果您希望它们是 public,您必须在 SignupViewController.h 中声明属性,并将它们从 .m 文件中删除。
.m 文件中的任何内容只能在该文件中使用,如果您希望它在其他地方可用,您必须将其放入 .h 文件中并导入 .h 文件。这不是今天常见的编程语言功能,但在较旧的编程语言中(Obj-C 已接近 30 年)通常都是它们的工作方式。