2016-03-03 33 views
1

我想檢查我目前的UITextField,並在編輯完成的情況下跳轉到下一個。如何在編輯完成後跳轉到下一個UITextField?

到目前爲止,我已經實現了此代碼,但由於某種原因無法正常工作。

重要提示:實際按預期工作的代碼是Robert方法,請參閱下文。由於我的名聲很低,我不能爲他投票。

新增:我用這來限制到一個字符

//Limit the length of the UITextfields 
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    guard let text = textField.text else { return true } 
    let newLength = text.characters.count + string.characters.count - range.length 

    print("textField...shouldChangeCharactersInRange method called") 

    switch textField { 
    case rateTvA: 

     return newLength <= limitLength 

    case rateTvB: 

     return newLength <= limitLength 

    case rateTvC: 
     return newLength <= limitLength 

     // Do not put constraints on any other text field in this view 
     // that uses this class as its delegate. 
    default: 
     return true 
    } 

} 

注:我期待收到一張單字符每個的UITextField

func textFieldShouldEndEditing(textField: UITextField) -> Bool { 
    let charCount = textField.text!.characters.count 
    print("textFieldShouldEndEditing method called") 
    print("How many characters has been typed in? \(charCount)") 

    switch textField { 
    case rateTvA: 
     if(charCount > 0) { 
      rateTvB.becomeFirstResponder() 
      return true 
     } 
    case rateTvB: 
     if(charCount > 0) { 
      rateTvC.becomeFirstResponder() 
      return true 
     } 
    case rateTvC: 
     if(charCount > 0) { 
      rateTVD.becomeFirstResponder() 
      return true 
     } 
    default: 
     return false 
    } 
    return false 
} 
+0

有你添加的UITextField委託? – casillas

+0

它不起作用,由於某種原因不會觸發你的功能,我只是輸入字符,它不會跳。任何想法發生了什麼? ---請參閱我更新的帖子,其中包括限制長度的代碼。 – Carlos

回答

2

您需要什麼取決於您希望用戶的體驗。

1)您想在用戶輸入單個字符後自動跳轉到下一個文本字段。在這種情況下,您應該使用Interface Builder將文本字段的「Editing Changed」事件連接到控制器中的IBAction方法。 IBAction方法應執行第一個響應者切換邏輯。

2)您希望用戶採取一些操作來指示編輯已完成。那個動作的處理程序應該執行第一個響應者切換邏輯。我認爲迴歸鍵是一個好方法。在這種情況下,您將使用TextField委託的textFieldShouldReturn方法。

此外,你應該想想你想有發生,如果用戶通過點擊在B或C(或者在其他一些UI元素,你都呈現)文本字段中結束文本字段的的編輯的內容;在這種情況下,您的文本字段委託的textFieldXXXXEndEditing方法將被調用。問題是:如果textFieldXXXXEndEditing方法將焦點從用戶選擇的元素切換開來?

最後,你說你的代碼不工作。什麼不起作用?沒有調用textFieldShouldEndEditing方法?如果否,那麼你可能不會分配給文本字段的委託屬性。或者,你可能會對導致textFieldShouldEndEditing方法被調用的原因感到困惑(我上面的建議應該會給你一些線索)。

這是一些代碼。應使用IB連接插座。另外,使用IB將三個文本字段中的每一個的Editing Changed事件連接到IBAction方法。

class ViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var textFieldA: UITextField! 
@IBOutlet weak var textFieldB: UITextField! 
@IBOutlet weak var textFieldC: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    textFieldA.delegate = self 
    textFieldB.delegate = self 
    textFieldC.delegate = self 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func textFieldShouldBeginEditing(textField: UITextField) -> Bool { 
    print("Should begin editing") 
    return true; 
} 

func textFieldDidBeginEditing(textField: UITextField) { 
    print("Did begin editing") 
} 

func textFieldShouldEndEditing(textField: UITextField) -> Bool { 
    print("Should end editing") 
    return true; 
} 

func textFieldDidEndEditing(textField: UITextField) { 
    print("Did end editing") 
} 

func textFieldShouldClear(textField: UITextField) -> Bool { 
    print("Should clear") 
    return true; 
} 

func textFieldShouldChangeCharactersInRange(textField: UITextField, range: NSRange, replacement: String) -> Bool { 
    print("Should change") 
    return true; 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    print("User pressed return: switching to next text field") 

    switchFields(textField) 

    return true; 
} 

@IBAction func textChanged(textField: UITextField) { 
    print("User entered a character; switching to next text field") 

    switchFields(textField) 
} 

private func switchFields(textField: UITextField) { 
    switch textField { 
    case textFieldA: 
     textFieldB.becomeFirstResponder() 
    case textFieldB: 
     textFieldC.becomeFirstResponder() 
    case textFieldC: 
     textFieldA.becomeFirstResponder() 
    default: 
     break 
    } 
} 

}

+0

我真的很感謝你的解釋,但你可以在這裏遮住一些示例代碼嗎?請記住我是這樣問的,因爲我不是Swift忍者。 – Carlos

+0

嗨卡洛斯。我添加了代碼[編譯並運行:-)]。請讓我知道它是否有幫助。 – Verticon

+0

完美!代碼正如預期那樣工作;-)非常感謝Robert。由於我有幾點意見,我可以如何投票迴應您的迴應? – Carlos

1

你也許應該改變在「textFieldDidEndEditing」委託調用中的響應者。因此,採取了xxx.becomeFirstResponder()調用「textFieldShouldEndEditing」和大致實現:

optional func textFieldDidEndEditing(_ textField: UITextField) { 

switch textField { 
case rateTvA: 
     rateTvB.becomeFirstResponder() 
case rateTvB: 
     rateTvC.becomeFirstResponder() 
case rateTvC: 
     rateTVD.becomeFirstResponder() 
default: 
    return 
} 
return 

我還沒有編這個所以要小心。

+0

它不起作用,它不會跳到下一個字段,請參閱我的更新後的帖子,其中包括限制長度大小的功能。除了沒有跳到下一個UITextfield之外,一切都很好。 – Carlos

0

在Objective C中,你可以這樣做:

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 

    if (_verifyOTP.text.length >= 1 && range.length == 0) 
    { 
     [self.verifyOTP2 becomeFirstResponder]; 
    } 

    if(_verifyOTP2.text.length >= 1 && range.length == 0) { 

     [_verifyOTP2 resignFirstResponder]; 
     [self.verifyOTP3 becomeFirstResponder]; 
    } 

    if (_verifyOTP3.text.length >= 1 && range.length == 0) 
    { 
     [_verifyOTP3 resignFirstResponder]; 
     [self.verifyOTP4 becomeFirstResponder]; 

    } 

    if (_verifyOTP4.text.length >= 1 && range.length == 0) 
    { 
     [self.verifyOTP4 becomeFirstResponder]; 
    } 
    return YES; 
} 

使用文本框代表

相關問題