這篇文章我曾在另一個博客發(fā)表過既忆,3年過去了驱负,之前一直沒有寫博客的習(xí)慣,一拖就是三年患雇,是時候?qū)懴乱黄说缦薄R韵率侵暗陌徇\,并在排版上有些調(diào)整庆亡。
其實吧。我覺得這個功能應(yīng)該系統(tǒng)自動實現(xiàn)的捞稿。那既然現(xiàn)在沒有這個功能又谋,我們手動來實現(xiàn)吧。
我之前遇到這個問題的時候網(wǎng)上找過很多方案娱局,但皆不盡如人意彰亥。可能因為我有多個text field衰齐,按return會自動聚焦到下一個任斋。情況就復(fù)雜了。
后經(jīng)過我反復(fù)調(diào)試耻涛,找到了一個比較穩(wěn)定的方案废酷。
注:我調(diào)試的時候發(fā)現(xiàn)排版有問題,模擬器的話試下不同尺寸的iphone抹缕。為方便閱讀澈蟆,每一步的新加代碼都是紅色會用注釋標(biāo)明。其他黑色的代碼作為上下文位置的參考卓研。如果還是覺得?看起來很吃力的話趴俘,還請留言吧睹簇,我給優(yōu)化一下。
1.新建一個Single View Application寥闪,不用加其他的文件太惠。
2.先給界面加上必要的控件,UITextField X 3 , UIButton X 1疲憋。并關(guān)聯(lián)到.h文件中凿渊。
3.簡單實現(xiàn)一下click的動作,就顯示一個UIAlertView吧柜某。
//-----------新代碼-----------
- (IBAction)click:(id)sender {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Job Done!"delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
//---------------------------
4.實現(xiàn)一下鍵盤的return事件嗽元。 首先加上必要的成員變量和聲明繼承的protocol,用一個NSArray來遍歷UITextField喂击。
//.h
//-----------新代碼-----------
@interface ViewController : UIViewController<UITextFieldDelegate> {
NSArray *_inputFocuses;
BOOL _pressedReturn;
}
//---------------------------
@property (weak, nonatomic) IBOutlet UITextField *textField1;
@property (weak, nonatomic) IBOutlet UITextField *textField2;
@property (weak, nonatomic) IBOutlet UITextField *textField3;
@property (weak, nonatomic) IBOutlet UIButton *button;
- (IBAction)click:(id)sender;
@end
//.m
- (void)viewDidLoad {
[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.
//-----------新代碼-----------
_textField1.delegate = self;
_textField2.delegate = self;
_textField3.delegate = self;
_inputFocuses = [NSArray arrayWithObjects:_textField1, _textField2, _textField3, nil];
//---------------------------
}
//-----------新代碼-----------
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
int index = [_inputFocuses indexOfObject:textField];
if (index == [_inputFocuses count] - 1) {//如果是最后一個text field時按return 就點擊按鈕
[self click:_button];
}
else {//如果沒有到最后一個text field就將焦點轉(zhuǎn)向下一個text field
UITextField *nextTextField = [_inputFocuses objectAtIndex:(index + 1)];
[nextTextField becomeFirstResponder];
}
UITextField *currentTextField = [_inputFocuses objectAtIndex:index];
[currentTextField resignFirstResponder];
return NO;
}
//---------------------------
Test Run:點擊任意text field剂癌,按下鍵盤的return,焦點會一個個下移翰绊,雖然我們現(xiàn)在還看不到佩谷,不過,相信我监嗜,是這樣的谐檀。。裁奇。最后按到了按鈕桐猬,彈出了alert,這個不用質(zhì)疑刽肠。
5.再添加一個點擊非鍵盤區(qū)域就讓鍵盤消失的功能吧溃肪。首先要補(bǔ)上一個回調(diào)方法的實現(xiàn)在此之前先聲明一些新的要用到的變量。
//.h
@interface ViewController : UIViewController {
//-----------新代碼-----------
BOOL _isKeyboardShowing;
UITextField *_activeTextField;
BOOL _addedObserver;
//---------------------------
NSArray *_inputFocuses;
BOOL _pressedReturn;
}
//.m
#pragma mark - UITextFieldDelegate
//-----------新代碼-----------
// 點擊文本框會先觸發(fā)這個代理
-(void)textFieldDidBeginEditing:(UITextField *)textField {
_pressedReturn = NO;//按下return和直接點擊text field都會觸發(fā)這個方法音五,所以用一個標(biāo)示的變量來區(qū)分惫撰,后面會發(fā)揮作用的。
_activeTextField = textField;
}
//---------------------------
然后重寫這個方法
//-----------新代碼-----------
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
NSLog(@"location : (%.2f,%.2f)", location.x, location.y);
if (_isKeyboardShowing && _activeTextField) {
[_activeTextField resignFirstResponder];
}
}
//---------------------------
這樣躺涝,編輯的時候就能記下當(dāng)前的text field到_activeTextField了厨钻。
然后標(biāo)記一下鍵盤正在顯示。
//.m
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//-----------新代碼-----------
if (!_addedObserver) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
_addedObserver = YES;
}
//---------------------------
_textField1.delegate = self;
_textField2.delegate = self;
_textField3.delegate = self;
_inputFocuses = [NSArray arrayWithObjects:_textField1, _textField2, _textField3, nil];
}
//-----------新代碼-----------
#pragma mark - KeyboardNotification
// 觸發(fā)文本框代理以后觸發(fā)這個消息
- (void)KeyboardWillShow:(NSNotification *)notification {
_isKeyboardShowing = YES;
}
- (void)KeyboardWillHide:(NSNotification *)notification {
//這個方法等后面再實現(xiàn)坚嗜,先占個坑夯膀。因為和現(xiàn)在要做的步驟無關(guān)。
}
//---------------------------
到這里為止苍蔬,我們把準(zhǔn)備工作做的很充分了棍郎,接下來就要玩一些更有趣的操作了。
我已經(jīng)把這篇的代碼新開一個工程測試過了银室,基本上復(fù)制黏貼就能一步步實現(xiàn)涂佃。如果發(fā)現(xiàn)有問題的話励翼,還請留個言。
那接下去的就放到下一篇吧辜荠,接下來就是獲取鍵盤高度汽抚,調(diào)整view的位置了。