首个 iOS 应用程序(五)
排除故障和检查代码
如果应用程序未能正确工作,请尝试本章描述的解决问题方法。如果应用程序仍然不能正确工作,请将您的代码与本章末尾给出的清单进行比较。
代码和编译器警告
代码编译时应该不会有任何警告。如果真的收到警告,就很有可能是代码出错了。因为 Objective-C 是一种非常灵活的程序设计语言,有时候编译器给出的也仅仅是一些警告而已。
检查串联图文件
如果程序未能正确工作,开发者会很自然地去检查源代码来找出错误。但使用 Cocoa Touch,又增添了另一个层面。应用程序的大部分配置可能是“编码”在串联图中。例如,如果连接不正确,应用程序的行为就会与您的期望不符。
-
如果点按按钮时文本没有更新,可能是没有将按钮的操作连接到视图控制器,或是没有将视图控制器的 outlet 连接到文本栏或标签。
-
如果点按“Done”按钮时键盘不消失,可能是没有将文本栏的委托连接好,或者把视图控制器的
textField
Outlet 连接到了文本栏。务必在串联图上检查文本栏的连接:按住 Control 键点按文本栏以显示半透明的连接面板。您应该会在delegate
outlet 和textField
引用 outlet 的旁边,看到带有填充的圆圈。如果您已连接了委托,可能有更微妙的问题(请参阅下一部分“委托方法的名称”)。
委托方法的名称
与委托有关的一个常见错误是拼错委托方法的名称。即使已经正确设定了委托对象,但是如果委托未在其方法实现中使用正确的名称,则不会调用正确的方法。通常最好的做法是从文稿中拷贝和粘贴委托方法声明(例如 textFieldShouldReturn:
)。
代码清单
这一部分提供 HelloWorldViewController
类的接口和实现文件的代码清单。请注意,该清单并未列出 Xcode 模板提供的注释和其他方法的实现。
接口文件:HelloWorldViewController.h
#import <UIKit/UIKit.h> @interface HelloWorldViewController :UIViewController <UITextFieldDelegate> @property (copy, nonatomic) NSString *userName; @end
实现文件: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. } - (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
开发者讨论群:285879438