2011-06-16 110 views
13

我搜索了很多谷歌搜索和heree,但沒有用。檢測UITextField失去焦點

我有兩個文本框,我無法識別哪一個失去了焦點。
我試過所有選項,但沒有。

這裏textFieldDidEndEditing

- (void) textFieldDidEndEditing:(UITextField *)textField { 
    NSLog(@"%@", [textField state]); 
    NSLog(@"%d", [textField isSelected]); 
    NSLog(@"%d", [textField isFirstResponder]); 
    NSLog(@"%d", [textField isHighlighted]); 
    NSLog(@"%d", [textField isTouchInside]); 

    if (![textField isFirstResponder] || ![textField isSelected]) { 
    //if ([textField state] != UIControlStateSelected) { 
    NSLog(@"not selected!"); 
    [...] 
    // remove view/etc... 
    } 
} 

所有的NSLog返回0!爲什麼?!?

如何檢測丟失的焦點?每次我按下鍵盤按鈕時都會調用此方法,而不僅僅是在最後!
有沒有其他的選擇?

編輯
我不想從文本轉換,但我想檢測丟失的焦點,當我在屏幕上點擊反正。 (鍵盤將消失或不插入文本字段中)。

謝謝。

回答

3

要處理在外部文本字段中敲擊,您可以覆蓋touchesBegan在您的視圖控制器:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    if ([textField1 isFirstResponder] && (textField1 != touch.view)) 
    { 
     // textField1 lost focus 
    } 

    if ([textField2 isFirstResponder] && (textField2 != touch.view)) 
    { 
     // textField2 lost focus 
    } 

    ... 
} 
+0

..如果我點擊第二個TextField會發生什麼?沒有!!! – elp 2011-06-16 13:35:29

+0

你可以在'textFieldShouldBeginEditing'中通過檢查第一響應者來處理它: – 2011-06-16 14:46:20

+3

這不是非常可靠的..每當我觸摸屏幕上的某些指令時不會調用touchesBegan – abbood 2014-02-05 07:14:25

-3

當您創建文本字段,分配不同的標籤對他們說:

#define kSomeTag 100 
textField.tag = kSomeTag; 

在你的 - (空)textFieldDidEndEditing:(的UITextField *)文本框的方法,你可以知道哪些文本框通過查詢結束編輯其標籤:在textFieldShouldReturn方法

if (textField.tag == kSomeTag) { 
    // do something 
} 
+0

否,暫時不工作,因爲當我點擊文本框外什麼變化!標籤是一樣的,它是無動於衷! – elp 2011-06-16 10:34:12

2
- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
     NSLog(@"%d",textFiled.tag); 
     NSInteger nextTag = textField.tag + 1; 
     UIResponder* nextResponder = [textField.superview viewWithTag:nextTag]; 
     if (nextResponder) { 
      [nextResponder becomeFirstResponder]; 
     } else {   
      [textField resignFirstResponder]; 
     } 
     return YES; 
    } 

的UITextField與標籤已經失去了重心

這將幫助您從一個TextField轉到另一個....只需在所有TextField中增加設置標籤,例如:0,1,2,3 ....等

+0

不,不,這是不正確的!通過這種方式,當我不使用ShouldReturn時單擊文本字段外部時,我無法獲得焦點! – elp 2011-06-16 10:32:45

+1

根據我的意見,你應該必須爲此創建自定義方法.. – 2011-06-16 10:39:24

0

這不是因爲你問到如何失去焦點,當處理一個直接的答案。我認爲有些時候有明確的保存和取消按鈕可以解僱。特別是在文本視圖中,您希望爲其預期用途保留返回鍵。

這是一個使用「完成」和「取消」按鈕向鍵盤添加工具欄的類。我現在在iOS 8中工作。我對iOS很新,所以可能有更好的方法來做到這一點。隨時諮詢如何改進的建議。

DismissableTextView.h ...

#import <UIKit/UIKit.h> 

@interface DismissableTextView : UITextView 

@end 

DismissableTextView.m ...

#import "DismissableTextView.h" 

@implementation DismissableTextView 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     [self setInputView]; 
    } 
    return self; 
} 

- (id) initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     [self setInputView]; 
    } 
    return self; 
} 

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    [self setInputView]; 
} 

- (void) setInputView { 
    [self createToolbar]; 
} 
-(void) createToolbar { 

    // Create toolbar for the keyboard so it can be dismissed... 
    UIToolbar* toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)]; 
    toolbar.barStyle = UIBarStyleDefault; 
    toolbar.items = [NSArray arrayWithObjects: 
          [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(cancelClicked)], 
          [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
          [[UIBarButtonItem alloc]initWithTitle:@"Apply" style:UIBarButtonItemStyleDone target:self action:@selector(doneClicked)], 
          nil]; 
    [toolbar sizeToFit]; 

    self.inputAccessoryView = toolbar; 
} 

- (IBAction)didBeginEditDescription:(id)sender 
{ 
} 

-(void)cancelClicked{ 

    // respond to cancel click in the toolbar 
    [self resignFirstResponder]; 
} 

-(void)doneClicked{ 

    // respond to done click in the toolbar 
    [self resignFirstResponder]; 
} 

@end