2015-04-02 59 views
0

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

  • 当我说secondTextField.becomeFirstResponder()的firstTextField的值被复制到secondTextField
  • 我使用的是十进制垫 - 键盘类型

这是我到目前为止,我做无法找到解决办法来解决这个问题:

  • 使用UITextFieldDelegate
  • IBOutlet中取得连接对所有文本字段
  • firstText.delegate = self secondText.delegate = self thirdText.delegate = self firstText.becomeFirstResponder()
  • FUNC文本字段(文本框:的UITextField,shouldChangeCharactersInRange范围:NSRange,replacementString字符串:字符串) - >布尔{ 变种newLength = countElements(的TextField.text)+ countElements(字符串) - 范围。长度

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

    }

    FUNC changeFocus(的nextfocus:的UITextField){

    if nextFocus == firstText { 
        firstText.resignFirstResponder() 
        secondText.becomeFirstResponder() 
    } else if nextFocus == secondText { 
        secondText.resignFirstResponder() 
        thirdText.becomeFirstResponder() 
    } else if nextFocus == thirdText { 
        thirdText.resignFirstResponder() 
    } 
    

    }

我怎样才能做到这一点正确,任何帮助和建议,请。

+0

使用此https://github.com/kylef/BSKeyboardControls – Kalpesh 2015-04-02 06:30:13

+0

如果我可以在没有图书馆的情况下做到这一点,那将会很棒。 – 2015-04-02 06:33:16

回答

0

我发现类似的东西在这里:similar

得到它的工作,有两个限制:

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

    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() 
    } 
    

    }

  • 方法来检查管脚/密码:

    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 
    } 
    

希望这些帮助稍后一些。

+0

对于那些找到这个答案的人,你可以通过用'return(count(myString) - range.length')替换'shouldChangeCharactersInRange'的'return false'来处理不能删除的问题。 1)' – user3498976 2015-07-21 18:53:52

0

使用该委托方法来改变焦点

func textFieldShouldReturn(textField: UITextField) -> Bool 
+0

十进制小面板没有返回或完成按钮,因此委托方法永远不会被调用。我也尝试过使用textFieldShouldEndEditing方法。 – 2015-04-02 06:21:52

+0

如果是这样,然后尝试检查下面的链接:http://stackoverflow.com/questions/26031798/how-to-get-keyboard-location-in-ios-8-add-done-button-on-numberpad。你需要添加返回按钮到你的愿望要求的键盘 – svrushal 2015-04-02 06:32:36

+0

有没有什么办法,我不必使用返回按钮?真的想保持ui默认,所以我不必改变键盘。 – 2015-04-02 06:37:51

0

要添加更多一点svrushal答案:

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

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

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

} 
+0

已经尝试过,但委托方法永远不会被调用,就像我说我正在使用一个小数点,所以我不确定这个方法在这里。 – 2015-04-02 06:24:34

+0

哦,好的!对不起,我没有注意到 – 2015-04-02 06:30:08