Ios Swift:从一个文本字段移动到另一个文本字段

Ios Swift:从一个文本字段移动到另一个文本字段,ios,swift,xcode,uitextfield,uitextfielddelegate,Ios,Swift,Xcode,Uitextfield,Uitextfielddelegate,当用户在文本字段中输入两个字符时,焦点应该移到下一个文本字段。 以下是我使用的代码: func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if let text = textField.text { let newStr = (text as

当用户在文本字段中输入两个字符时,焦点应该移到下一个文本字段。

以下是我使用的代码:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if let text = textField.text {

            let newStr = (text as NSString)
                .stringByReplacingCharactersInRange(range, withString: string)
            if newStr.isEmpty {
                return true
            }
            let intvalue = Int(newStr)

            if textField.tag == 101 { print("101") // only 2 integer
                 return (intvalue >= 0 && intvalue <= 99) ? true : false
            }
            else if textField.tag == 102 { print("102") // only 4 integer
                 return (intvalue >= 0 && intvalue <= 9999) ? true : false
            }

        }
        return true
    }
func textField(textField:UITextField,shouldChangeCharactersRange:NSRange,replacementString:string)->Bool{
如果let text=textField.text{
let newStr=(文本为NSString)
.StringByReplacingCharactersRange(范围,带字符串:字符串)
如果我是空的{
返回真值
}
让intvalue=Int(newStr)
如果textField.tag==101{print(“101”)//只有2个整数

return(intvalue>=0&&intvalue=0&&intvalue在用户输入2个字符后,您应该告诉下一个文本字段成为第一个响应者,如下所示:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if (textField.text?.characters.count == 2) {
        textField.resignFirstResponder()
        yourNextTextField.becomeFirstResponder()
    }
    return true
}

下一步
完成
按钮的一种可能性是在数字键盘上方使用
UIToolbar
。这样,您可以为这两个按钮分配一个功能,因为它们是
UIBarButtonItem

我在
Objective C
中有一些示例代码,如果您需要,我可以将其转换为
Swift

要创建
UIToolbar
,请使用以下命令:

UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 44)];
toolBar.barStyle = UIBarStyleBlackTranslucent;

UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTouched:)];
UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"nextIcon"] style:UIBarButtonItemStylePlain target:self action:@selector(nextTouched:)];

// the middle button is to make the Done button align to right
[toolBar setItems:[NSArray arrayWithObjects:nextButton, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], doneButton, nil]];
picker1.inputAccessoryView = toolBar;
picker2.inputAccessoryView = toolBar;
picker3.inputAccessoryView = toolBar;
要实现
Next
功能,请使用以下代码:

-(void) nextTouched:(UIBarButtonItem*)itemClicked {
    if [([picker1 isFirstResponder])
        [picker2 becomeFirstResponder];
    else if [([picker2 isFirstResponder])
        picker3 becomeFirstResponder];
}
//ViewDidLoad中的此代码
txtCardDetails3.addTarget(self,action:#选择器(VerifyCardViewController.textFieldDidChange(:)),forControlEvents:UIControlEvents.EditingChanged)
func textField didchange(textField:UITextField){
让text=textField.text
如果textField.tag==101{//在设计时设置标记
如果文本?.utf16.count==2{
txtCardDetails4.成为第一响应者()
}
}
}
//按原样输入代码
func textField(textField:UITextField,shouldChangeCharactersRange:NSRange,replacementString:string)->Bool{
如果let text=textField.text{
let newStr=(文本为NSString)
.StringByReplacingCharactersRange(范围,带字符串:字符串)
如果我是空的{
返回真值
}
让intvalue=Int(newStr)
如果textField.tag==101{print(“101”)

return(intvalue>=0&&intvalue=0&&intvalue一旦它帮助了你,请看这个@Anbu.Karthik:非常有用的帖子!如果你想移动到下一个textfield,你必须让当前的textfield退出它的响应者,让下一个成为第一响应者。你还可以听texField文本计数并使用标记属性和
becomeFirstResponder()
将下一个字段设置为第一响应者。我不能在shouldchangeCharactersRange中使用代码,因为它已经被其他验证内容占用。另一种方法是使用Observer。您应该仍然能够使用shouldchangeCharactersRange,您可以在重新分配第一响应者之前检查正在更改的文本字段看到新发布的答案。这是我期待的。谢谢你的帖子!
// This code in ViewDidLoad
txtCardDetails3.addTarget(self, action: #selector(VerifyCardViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

func textFieldDidChange(textField: UITextField){

        let text = textField.text

        if textField.tag == 101 { // Set tag at design time
            if text?.utf16.count==2 {
                txtCardDetails4.becomeFirstResponder()
            }
        }
    }

// This code as it is 
 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if let text = textField.text {

            let newStr = (text as NSString)
                .stringByReplacingCharactersInRange(range, withString: string)
            if newStr.isEmpty {
                return true
            }
            let intvalue = Int(newStr)

            if textField.tag == 101 { print("101")
                 return (intvalue >= 0 && intvalue <= 99) ? true : false
            }
            else if textField.tag == 102 { print("102")
                 return (intvalue >= 0 && intvalue <= 9999) ? true : false
            }

        }
        return true
    }