Ios 使登录屏幕类似于锁定屏幕

Ios 使登录屏幕类似于锁定屏幕,ios,swift,uitextfield,Ios,Swift,Uitextfield,我试图使一个登录屏幕类似于锁定屏幕4文本字段。 我面临的问题是将焦点从一个文本字段更改为下一个文本字段 当我说secondTextField.becomeFirstResponder()时,firstTextField的值被复制到secondTextField 我用的是十进制键盘 以下是我迄今为止所做的工作,我无法找到解决问题的方法: 使用UITextFieldDelegate 为所有文本字段建立IBOutlet连接 firstText.delegate=self secondText.d

我试图使一个登录屏幕类似于锁定屏幕4文本字段。 我面临的问题是将焦点从一个文本字段更改为下一个文本字段

  • 当我说
    secondTextField.becomeFirstResponder()
    时,firstTextField的值被复制到secondTextField
  • 我用的是十进制键盘
以下是我迄今为止所做的工作,我无法找到解决问题的方法:

  • 使用UITextFieldDelegate
  • 为所有文本字段建立IBOutlet连接
  • firstText.delegate=self
    secondText.delegate=self
    thirdText.delegate=self
    firstText.becomeFirstResponder()
  • func textField(textField:UITextField,shouldChangeCharactersRange:NSRange,replacementString:string)->Bool{ var newLength=countElements(textField.text)+countElements(string)-range.length

        if newLength == 1 {
            if textField == firstText{
                changeFocus(textField)
            }else if textField == secondText {
                changeFocus(textField)
            }else if textField == thirdText {
                changeFocus(textField)
            }
    
        }
    return newLength <= 1
    
    }


如何才能正确执行此操作,请提供任何帮助和建议。

使用此委托方法更改焦点

func textFieldShouldReturn(textField: UITextField) -> Bool

要为svrushal添加更多内容,请回答:

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if textField == firstText {
       secondText.becomeFirstResponder()
   }

   if textField == secondText {
       thirdText.becomeFirstResponder()
   }

   if textField == thirdText {
       fourthText.becomeFirstResponder()
   }

}
你可以参考这个链接


它会帮你的。

我在这里找到了类似的东西:

让它工作起来,有两个限制:

  • 首先,我不能向后删除
  • 其次,如果密码错误,用户必须点击第一个文本字段。 但现在这些已经足够好了
  • 以下是方法

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    
    var shouldProcess = false
    var moveToNextTextField = false
    var insertStringLength = countElements(string)
    if insertStringLength == 0 {
        shouldProcess = true
    }
    else {
        if countElements(textField.text) == 0 {
            shouldProcess = true
        }
    }
    if shouldProcess {
       var myString = textField.text
        if countElements(myString) == 0{
            myString = myString + string
    
            password = password + myString
            moveToNextTextField = true
        }
        textField.text = myString
    
        if moveToNextTextField {
            changeFocus(textField)
        }
    }
    return false
    }
    
  • 更改焦点的方法:

    func changeFocus(nextTextField : UITextField){
    if  nextTextField == firstText {
        firstText.resignFirstResponder()
        secondText.becomeFirstResponder()
    } else if nextTextField == secondText {
        secondText.resignFirstResponder()
        thirdText.becomeFirstResponder()
    } else if nextTextField == thirdText {
        thirdText.resignFirstResponder()
        fourthText.becomeFirstResponder()
    } else if nextTextField == fourthText {
        fourthText.resignFirstResponder()
    }
    
    }

  • 检查pin/密码的方法:

    func textFieldShouldEndEditing(textField: UITextField) -> Bool {
    if textField == fourthText {
       thirdText.resignFirstResponder()
        let pass = defaultUser.stringForKey(Admin)
        println("password = \(password)")
        if pass  == password {
    
            println("the password is correct")
            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                self.performSegueWithIdentifier("SegueToSecond", sender: self)
            }
    
        } else {
            println("wrong password")
            thirdText.text = ""
            secondText.text = ""
            firstText.text = ""
            fourthText.text = ""
            password = ""
            view.reloadInputViews()
        }
    
    }
    
    return true
    }
    

希望这些对以后的人有所帮助。

十进制键盘没有返回或完成按钮,因此委托方法永远不会被调用。我也尝试过textFieldShouldEndEditing方法。如果是,请尝试检查以下链接:。你需要在键盘上加一个返回键来满足你的需求。有没有办法不用返回键呢?我真的很想让ui保持默认,所以我不需要改变键盘。要做到这一点,你需要一个额外的按钮。我建议你可以在UI的背景中添加一个按钮。你可以用它来改变焦点。否则,用数字和标点符号键盘代替数字键盘。限制其他符号。它有返回按钮我尝试过这个,但是委托方法从未被调用,就像我说的我使用的是十进制键盘,所以我不确定这个方法在这里是否有效。哦,好的!很抱歉,我并没有注意到,若我可以在并没有库的情况下完成这些,那个么这将是一件好事。对于找到这个答案的任何人来说,你们可以通过将
shouldChangeCharactersInRange
return false
替换为
return(count(myString)-range.length<1)
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
if textField == fourthText {
   thirdText.resignFirstResponder()
    let pass = defaultUser.stringForKey(Admin)
    println("password = \(password)")
    if pass  == password {

        println("the password is correct")
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            self.performSegueWithIdentifier("SegueToSecond", sender: self)
        }

    } else {
        println("wrong password")
        thirdText.text = ""
        secondText.text = ""
        firstText.text = ""
        fourthText.text = ""
        password = ""
        view.reloadInputViews()
    }

}

return true
}