按照之前九章iOS應(yīng)用程序開發(fā)教程操作到這里,如果你的應(yīng)用程序不能正確工作,請嘗試本文描述的解決問題方法。如果應(yīng)用程序仍然不能正確工作,你可以把你自己的代碼與本文末尾給出的清單進(jìn)行比較。
代碼和編譯器警告
代碼編譯時應(yīng)該不會有任何警告。如果真的收到警告,就很有可能是代碼出錯了。因?yàn)?Objective-C 是一種非常靈活的程序設(shè)計語言,有時候編譯器給出的也僅僅是一些警告而已。
檢查串聯(lián)圖文件
如果程序未能正確工作,開發(fā)者會很自然地去檢查源代碼來找出錯誤。但使用 Cocoa Touch,又增添了另一個層面。應(yīng)用程序的大部分配置可能是"編碼"在串聯(lián)圖中。例如,如果連接不正確,應(yīng)用程序的行為就會與你的期望不符。
·如果點(diǎn)按按鈕時文本沒有更新,可能是沒有將按鈕的操作連接到視圖控制器,或是沒有將視圖控制器的 outlet 連接到文本欄或標(biāo)簽。
·如果點(diǎn)按"Done"按鈕時鍵盤不消失,可能是沒有將文本欄的委托連接好,或者把視圖控制器的 textField Outlet 連接到了文本欄。務(wù)必在串聯(lián)圖上檢查文本欄的連接:按住 Control 鍵點(diǎn)按文本欄以顯示半透明的連接面板。你應(yīng)該會在 delegate outlet 和 textField 引用 outlet 的旁邊,看到帶有填充的圓圈。
如果你已連接了委托,可能有更微妙的問題(請參閱下一部分"委托方法的名稱")。
委托方法的名稱
與委托有關(guān)的一個常見錯誤是拼錯委托方法的名稱。即使已經(jīng)正確設(shè)定了委托對象,但是如果委托未在其方法實(shí)現(xiàn)中使用正確的名稱,則不會調(diào)用正確的方法。通常好的做法是從文稿中拷貝和粘貼委托方法聲明(例如 textFieldShouldReturn:)。
代碼清單
這一部分提供 HelloWorldViewController 類的接口和實(shí)現(xiàn)文件的代碼清單。請注意,該清單并未列出 Xcode 模板提供的注釋和其他方法的實(shí)現(xiàn)。
接口文件:HelloWorldViewController.h
#import <UIKit/UIKit.h>
@interface HelloWorldViewController :UIViewController <UITextFieldDelegate>
@property (copy, nonatomic) NSString *userName;
@end
實(shí)現(xiàn)文件: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
|