如何在编辑完成后跳转到下一个UITextField?

时间:2016-03-03 19:41:59

标签: ios swift swift2

我想检查我当前的UITextField,并在编辑完成时跳转到下一个。

到目前为止,我已实现此代码,但由于某些原因无效。

重要事项:实际按预期工作的代码是Robert方法,请参见下文。因为我的声誉很低,所以我无法为他投票。

NEW ADDED:我使用此限制为一个字符

    //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
}

3 个答案:

答案 0 :(得分:2)

您需要什么取决于您希望用户获得的体验。

1)您希望在用户输入单个字符后自动跳转到下一个文本字段。在这种情况下,您应该使用Interface Builder连接文本字段&#34;编辑已更改&#34;事件到控制器中的IBAction方法。 IBAction方法应该执行第一响应者切换逻辑。

2)您希望用户采取某些操作来指示编辑已完成。然后,该动作的处理程序应该执行第一响应者切换逻辑。我认为返回键是一个很好的方法。在这种情况下,您将使用TextField委托的textFieldShouldReturn方法。

此外,如果用户通过单击文本字段B或C之一(或您正在呈现的其他UI元素)结束文本字段A的编辑,您应该考虑要发生的事情;在这种情况下,将调用您的文本字段委托的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
    }
}

}

答案 1 :(得分:1)

您应该更改“textFieldDidEndEditing”委托调用中的响应者。因此,请在“textFieldShouldEndEditing”中取出xxx.becomeFirstResponder()调用并大致实现:

{{1}}

我没有编译这个,所以要小心。

答案 2 :(得分: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;
}

使用textfield delegate