如果你的应用仍然无法正常工作,请根据本章节来尝试进行故障排查。如果仍然无法找到错误,请按照本章节最后的代码清单和你的代码进行逐一比对。
代码和编译器警告
你的代码应该能够无警告并通过编译。如果发现有警告出现,建议你将它们当成错误来看待。因为 Objective-C 是个非常灵活的语言,有时候编译器顶多把一些地方判定成警告而不是错误。
检查故事板文件
作为一名开发者,如果发现有东西运行不正常,出于自然的直觉你大概会去检查源代码中的漏洞。但是在 Cocoa Touch 开发中,需要注意另一件事:你的应用中许多配置可能被“编码”到了故事板文件中。打个比方,如果你的连接不正确,应用也不会如预期那样正常工作。
- 如果点按按钮后文字没有更新,则可能是按钮的动作没有和视图控制器正确连接,或者是视图控制器的插座变量没有和文本框或者标签正确连接。
- 如果你点按 Done 按钮后键盘并未收回,则有可能是文本框的委托或者视图控制器的 textField 插座变量没有跟文本框正确连接。请务必检查故事板中文本框的连接情况:按住 Control 键并点按文本框,调出半透明的连接面板。你应该看到 delegate 插座变量以及 textField 引用旁边是带有填充的圆形。
如果你确实连接了委托,那么可能存在某些更加微妙的问题(参看下边的“委托方法名称”)。
委托方法名称
委托中常见的一个错误就是拼错委托方法的名称。就算正确设定了委托对象,但是如果委托没有使用方法实现中的正确名称,则正确的方法就永远也不会被调用。最好的建议是从开发者文档中拷贝和粘贴委托方法的声明,比如 textFieldShouldReturn:。
代码清单
在这个部分,HelloWorldViewController 类的接口和实现文件都被完全罗列出来。需要注意的是本代码清单不包含由 Xcode 模板提供的其他方法实现以及代码注释。
接口文件:HelloWorldViewController.h
#import <UIKit/UIKit.h>
@interface HelloWorldViewController : UIViewController <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (nonatomic, copy) NSString *userName;- (IBAction)changeGreeting:(id)sender;
@end
实现文件:HelloWorldViewController.m
#import “HelloWorldViewController.h”
@implementation HelloWorldViewController
@synthesize textField=_textField;
@synthesize label=_label;
@synthesize userName=_userName;
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textField) {
[theTextField resignFirstResponder];
}
return YES;
}- (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;
}
@end转自:http://www.guomii.com/posts/21142