2014-02-10 58 views
1

我已經搜索並看到了很多關於textFieldShouldReturn方法的答案。其中一半已經過時,一些在不同情況下工作,有些則沒有詳細解釋。我不確定什麼是最好的方式來完成這項任務,它的工作原理,但我認爲可能有一個更簡單的方法來做到這一點。Text Field Should Return,this is correct for ios7?

繼承人到目前爲止我的代碼:

在頭文件:

@interface ClassName : SomeUIViewController <UITextFieldDelegate> 

在實現文件:

@interface ClassName() 

@property (weak, nonatomic) IBOutlet UITextField *firstOne; 
@property (weak, nonatomic) IBOutlet UITextField *secondOne; 
@property (weak, nonatomic) IBOutlet UITextField *thirdOne; 
@property (weak, nonatomic) IBOutlet UITextField *fourthOne; 
@property (weak, nonatomic) IBOutlet UITextField *fifthOne; 

@end 

-(void)viewDidLoad{ 
    self.firstOne.delegate = self; 
    self.secondOne.delegate = self; 
    self.thirdOne.delegate = self; 
    self.fourthOne.delegate = self; 
    self.fifthOne.delegate = self; 
} 

-(BOOL)textFieldShouldReturn:(UITextField*)textField; 
{ 
    if (textField == self.firstOne) { 
     [textField resignFirstResponder]; 
     [self.secondOne becomeFirstResponder]; 
    } else if (textField == self.secondOne) { 
     [textField resignFirstResponder]; 
     [self.thirdOne becomeFirstResponder]; 
    } else if (textField == self.thirdOne) { 
     [textField resignFirstResponder]; 
     [self.fourthOne becomeFirstResponder]; 
    } else if (textField == self.fourthOne) { 
     [textField resignFirstResponder]; 
     [self.fifthOne becomeFirstResponder]; 
    } else if (textField == self.fifthOne) { 
     [textField resignFirstResponder]; 
    } 

    return NO; 
} 

所以這是正確的還是有更好的方法來做到這一點任務?

+0

如果您使用IB(Interface Builder),您可以在代碼中設置委託,而不是在代碼中。 – zaph

+0

看起來不錯。我做了類似的事情,它的工作。 – dasdom

回答

9

通常你的代碼是好的。

如果您正在使用IB(Interface Builder),您可以在其中設置代理,而不是在代碼中。

示例:控制從UITextField拖動到ViewController並選擇「委託」。 enter image description here

的resignFirstResponder可以被分解到IBE發生
重構代碼:

-(BOOL)textFieldShouldReturn:(UITextField*)textField; 
{ 
    [textField resignFirstResponder]; 

    if (textField == self.firstOne) { 
     [self.secondOne becomeFirstResponder]; 
    } else if (textField == self.secondOne) { 
     [self.thirdOne becomeFirstResponder]; 
    } else if (textField == self.thirdOne) { 
     [self.fourthOne becomeFirstResponder]; 
    } else if (textField == self.fourthOne) { 
     [self.fifthOne becomeFirstResponder]; 
    } 

    return NO; 
} 
+0

「您可以在代碼中設置委託,而不是在代碼中。」請解釋這個 – Esqarrouth

+1

我添加了文字和圖像。 – zaph

+0

我會試試看,謝謝 – Esqarrouth

2

我建議你用其它方法來做到這一點。您可以創建一個新類,使用類別擴展UITextField類,並添加您自己的屬性以在UIControls之間導航。

// Class name UITextField+Navigation.h 
@interface UITextField (Navigation) 

@property (weak, nonatomic) IBOutlet id nextUIControl; 

@end 

IBOutlet適用於如果您想在故事板中使用該屬性,則可以根據需要省略該屬性。

// UITextField+Navigation.m 
#import "UITextField+Navigation.h" 
#import <objc/runtime.h> 

static char defaultHashKey; 

@implementation UITextField (Navigation) 

- (id)nextUIControl 
{ 
    return objc_getAssociatedObject(self, &defaultHashKey); 
} 

- (void)setNextUIControl:(id)nextUIControl 
{ 
    objc_setAssociatedObject(self, &defaultHashKey, nextUIControl, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

@end 

在你的類,進口擴大的UITextField + Navigation.h類,以便您可以訪問您所創建的屬性。在viewDidLoad方法你只是分配下的UITextField

#import "UITextField+Navigation.h" 

@interface ClassName() 

@property (weak, nonatomic) IBOutlet UITextField *firstOne; 
@property (weak, nonatomic) IBOutlet UITextField *secondOne; 
@property (weak, nonatomic) IBOutlet UITextField *thirdOne; 
@property (weak, nonatomic) IBOutlet UITextField *fourthOne; 
@property (weak, nonatomic) IBOutlet UITextField *fifthOne; 

@end 
- (void)viewDidLoad 
{ 
    self.firstOne.nextUIControl = self.secondOne; 
    self.secondOne.nextUIControl = self.thirdOne; 
    etc... 
} 


或者,如果你使用的是故事板,可以將控制器鏈接到nextUIControl屬性的值。 nextUIControl 而在textFieldShouldReturn:

-(BOOL)textFieldShouldReturn:(UITextField*)textField; 
{ 
    [textField.nextUIControl becomeFirstResponder]; 
    return NO; 
} 
+0

你在哪裏看到:'nextUIControl'? – zaph

+0

@Zaph查看上面的修改。如果您有任何問題,請隨時問我。 –

+0

這是一個類還是類? – Esqarrouth

2

我的50美分。 我使用下一個方法。 UIKit對象(UIView,UITextField和其他)有一個名爲「tag」的可重寫屬性。這是開發人員使用的財產。

typedef NS_ENUM (NSInteger, SSSActionType) { 
    TextFieldTag1= 100, 
    TextFieldTag2= 110, 
    TextFieldTag3= 120 
}; 

- (void)customizeFields { 
    textField1.tag = TextFieldTag1; 
    textField1.delegate = self; 

    // setting tags for all fields 
} 

在委託方法比較整數標籤,而不是實例對象:

-(BOOL)textFieldShouldReturn:(UITextField*)textField { 
    [textField resignFirstResponder]; 

    switch (textField.tag) { 
     case TextFieldTag1: 
      // do stuff 
      break; 

     case TextFieldTag2: 
      break; 

     case TextFieldTag3: 
      break; 

     default: 
      break; 
    } 

    return NO; 
} 

看起來像第一種方法,但我更喜歡明確的標籤名稱和清晰的代碼

+0

這不完全看那麼簡單,我的方法? – Esqarrouth

+0

在你的情況下,我認爲它是一樣的。 對於這種做法我看下例: 1)您沒有IBOutlet中設置你的文本框,而是自己設置的標籤和委託參考IB並在代碼中實現唯一授權法的switch-case。 2)您有不願透露姓名的文本框的數組 - 爲了更清晰的代碼的目的 - 標籤將是有益的。 –

1

以及上面很好的答案。你仍然可以找到管理textfield所有東西的好圖書館。就像在tableview中使用textfields時一樣,在collectionview中使用textfields。 https://github.com/michaeltyson/TPKeyboardAvoiding。通過使用此庫,您可以輕鬆地進行登錄或註冊表單

0

我在Swift中的解決方案:
在TextField和下一個TextField之間創建字典映射。

// to find the next text field 
private lazy var textFields: [UITextField: UITextField] = 
    [self.firstTF: self.secondTF, 
     self.secondTF: self.thirdTF] 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    textFields[textField]?.becomeFirstResponder() 
    return true 
} 
0

我把每一個文本框連續標籤號。像0,1,2,3..n那麼用法是:

func textFieldShouldReturn(textField: UITextField) -> Bool { 

    let tag = textField.tag 

    if (tag < n) 
    { 
     let textfieldNew = theView.viewWithTag(tag + 1) as! UITextField 
     textfieldNew.becomeFirstResponder() 
    } 
    else 
    { 
     textField.resignFirstResponder() 

    } 
    return true 
}