排除错误和检查代码
如果你在编译或运行程序的时候遇到了一些问题,以至于程序不能正常运行, 那么就试一下这一章描述的方法来解决你的问题吧. 如果你的应用还不能正常运作,那么就和这一章最后所列出的代码比较一下吧.
代码与编译器警告
你的代码应该在编译的时候没有任何警告. 如果你获取到了一些警告,那么非常希望你将它视为错误. 因为Objective-C是一个非常灵活的语言,多数情况下编译器都会给你提示警告.
检查故事板文件
作为一名开发者,你肯定基于你的本能来检查你代码中的BUG. 但是当你是哦那个Cocoa Touch的时候,是添加在其他地方的. 你的应用的许多设置也许都会 "编码" 到了故事板中. 例如, 如果你没有正确的进行连接,那么你的应用将没有你所期待的表现.
-
如果当你点击按钮的时候,文本没有更新, 那么你可能没有将按钮的动作(action)连接到视图控制器中, 或者你没有连接文本框与标签的出口变量(outlet).
-
如果当你点击键盘上的Done的时候并没有消失掉,那么你可能没有连接文本框的代理或者连接视图控制器的textField出口变量(outlet)到文本框. 无比要在故事板上检查一下文本框的连接: 在文本框上按住Control键并左键点击就会显示出一个半透明的连接面板. 你应该可以在Outlets的delegate和Referencing Outlets中textField左面看到一个已填充的圆形.
-
如果你已经连接了代理,那么可能有一些更细节的问题 (see the next section请看下一部分, “代理方法的名字”).
代理方法的名字
一个常见的错误就是你把代码方法的名字拼错了. 如果没有在实现中使用正确的代理函数的名字的话,那么即使你已经正确设置了代理对象,它也是不会正确调用函数的. 这个通常最好的方法就是复制并粘贴代理函数的声明,例如文档中的textFieldShouldReturn函数,以防止函数名写错.
代码列表
这部分提供了HelloWorldViewController类文件的接口和实现文件(.h和.m). 注意这个下面所列出的文件不会显示任何注释以及Xcode所生成的其他函数的实现.
The Interface file: HelloWorldViewController.h
#import <UIKit/UIKit.h> |
|
@interface HelloWorldViewController : UIViewController <UITextFieldDelegate> |
|
@property (copy, nonatomic) NSString *userName; |
|
@end |
The Implementation File: HelloWorldViewController.m
#import "HelloWorldViewController.h" |
|
@interface HelloWorldViewController () |
|
@property (weak, nonatomic) IBOutlet UITextField *textField; |
@property (weak, nonatomic) IBOutlet UILabel *label; |
|
- (IBAction)changeGreeting:(id)sender; |
|
@end |
|
@implementation HelloWorldViewController |
|
- (void)viewDidLoad |
{ |
[super viewDidLoad]; |
// Do any additional setup after loading the view, typically from a nib. |
} |
|
- (void)viewDidUnload |
{ |
[self setTextField:nil]; |
[self setLabel:nil]; |
[super viewDidUnload]; |
// Release any retained subviews of the main view. |
} |
|
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation |
{ |
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); |
} |
|
- (IBAction)changeGreeting:(id)sender { |
|
self.userName = self.textField.text; |
|
NSString *nameString = self.userName; |
if ([nameString length] == 0) { |
nameString = @"World"; |
} |
NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString]; |
self.label.text = greeting; |
} |
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { |
|
if (theTextField == self.textField) { |
[theTextField resignFirstResponder]; |
} |
return YES; |
} |
|
@end |