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