对这个非常基本的问题抱歉,但在我的书籍和在线教程中,我找不到如何子类化自定义视图控制器的示例 - 究竟要写下什么以及我们可以从继承获得什么。基于其他语言的经验,我认为我将从子类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
如果有人能指出我的资源,那就完全拼出来了,我真的很感激。我确定它在文档中,但我找不到它。
答案 0 :(得分:3)
我收到的错误是UpdateViewController(继承自SignupViewController)没有scrollView,emailAddress,firstName,lastName等属性。我是否必须重新声明所有这些属性/写出所有内容?
如果属性是在SignupViewController.m中声明的,那么它们对SignupViewController.m外的所有代码都是不可见的。这是故意的,也是最常见的声明属性的方式。
如果您希望它们是公共的,则必须在SignupViewController.h中声明属性,并将它们从.m文件中删除。
.m文件中的任何内容仅在该文件中可用,如果您希望在其他地方可用,则必须将其放在.h文件中并导入.h文件。它现在不是一种常见的编程语言功能,但是在较旧的编程语言中(Obj-C已接近30年),通常它们都是如何工作的。