2017-04-23 13 views
1

私は動詞の過去の時制を入力しなければならないゲームに取り組んでいます。私のビューには、1文字しか受け付けない小さなテキストフィールドボックスが含まれています。現時点では、前者に文字が含まれている場合、次のテキストフィールドに自動的にジャンプしようとしています。Swift - 空でないときに次のテキストフィールドに自動的にジャンプする

すべてのボックスがいっぱいになるまでこれをやり続けます。ユーザーはまた、キーボードの戻るボタンを使用して1つのボックスに戻ることができます。

以下は現在使用しているコードですが、次のテキストフィールドにジャンプしていません。私は間違って何をしていますか?

var game: Game? { 
    didSet { 

     if var answerContent = game?.answer { 

      let views = (0..<answerContent.characters.count).map { _ in UITextField(frame: CGRect(x: 0, y: 0, width: 40, height: 40)) } 

      for textField in views { 
       textField.backgroundColor = UIColor.white 
       textField.textColor = Constants.MAIN_THEME_COLOR 
       textField.textAlignment = NSTextAlignment.center 
       textField.delegate = self 
       textField.returnKeyType = .next 
       textField.tag = views.index(of: textField)! + 1 
       self.container.addArrangedSubview(textField) 

       views.first?.becomeFirstResponder() 
      } 
     } 
    } 
} 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    guard let text = textField.text else { return true } 
    let textLength = text.characters.count + string.characters.count - range.length 

    return textLength <= 1 
} 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField { 
      print("Test") 
      nextField.becomeFirstResponder() 
     } else { 
      print("Test2") 
      textField.resignFirstResponder() 
     } 

    return false 
} 

更新されたコード(24-04-2017) - 次のテキストフィールドに

var game: Game? { 
    didSet { 

if var answerContent = game?.answer { 

      let views = (0..<answerContent.characters.count).map { _ in UITextField(frame: CGRect(x: 0, y: 0, width: 40, height: 40)) } 

      for textField in views { 
       textField.backgroundColor = UIColor.white 
       textField.textColor = Constants.MAIN_THEME_COLOR 
       textField.textAlignment = NSTextAlignment.center 
       textField.delegate = self 
       textField.addTarget(self, action: #selector(textChanged), for: .editingChanged) 
       textField.tag = views.index(of: textField)! + 1 
       self.container.addArrangedSubview(textField) 
      } 

      views.first?.becomeFirstResponder() 
     } 
    } 
} 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    guard let text = textField.text else { return true } 
    let textLength = text.characters.count + string.characters.count - range.length 

    return textLength <= 1 
} 

func textChanged(sender: UITextField) { 
    if (sender.text?.characters.count)! > 0 { 
     print("Entered") 
     let nextField = textField?.superview?.viewWithTag(textField.tag + 1) as UIResponder! 

     if (nextField != nil) { 
      nextField?.becomeFirstResponder() 
     } else { 
      print("Error: nil found") 
     } 
    } else { 
     print("Removed") 
     textField?.resignFirstResponder() 
    } 
} 

回答ジャンプしようとしたときにはnilを返します:

var index: NSInteger = 0 
for textField in views { 
    textField.backgroundColor = UIColor.white 
    textField.textColor = Constants.MAIN_THEME_COLOR 
    textField.textAlignment = NSTextAlignment.center 
    textField.autocapitalizationType = UITextAutocapitalizationType.none 
    textField.delegate = self 
    textField.addTarget(self, action: #selector(textChanged), for: .editingChanged) 
    textField.tag = index 
    self.container.addArrangedSubview(textField) 

    index+=1 
} 

func textChanged(sender: UITextField) { 
    if (sender.text?.characters.count)! > 0 { 
     let nextField = sender.superview?.viewWithTag(sender.tag + 1) as UIResponder! 
     nextField?.becomeFirstResponder() 
    } else { 
     sender.resignFirstResponder() 
    } 
} 

答えて

3

を私がすることを示唆していますコントロールイベントにターゲットを追加する必要があります.valueChanged

// for each text field 
textField.addTarget(self, action: #selector(textChanged), for: .valueChanged) 

次のようにtextChangedを実装します。

func textChanged(sender: UITextField) { 
    if sender.text.characters.length > 0 { 
     let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField 
     nextField?.becomeFistResponder() 
    } 
} 
+0

を私はあなたのアプローチを試してみましたが、それは全くtextChanged関数を呼び出していないです。 Swift 3.0と一線を画しながら少し更新しました。 –

+0

'func textChanged(送信者:UITextField){ if(sender.text?.characters.count)! > 0 { print( "Test") let nextField = textField.superview?.viewWithTag(textField.tag + 1)as? UITextField nextField?.beomeFirstResponder() } } ' –

+0

@DennisvanMazijkどこで' addTarget'呼び出しをしましたか? 'addTarget'呼び出しが実行されているかどうか確認してください。 – Sweeper

1

はコード従ってください:

import UIKit 

// used this to set max characters of UITextField in the storyboard 
private var __maxLengths = [UITextField: Int]() 
extension UITextField { 
    @IBInspectable var maxLength: Int { 
     get { 
      guard let l = __maxLengths[self] else { 
       return 150 // (global default-limit. or just, Int.max) 
      } 
      return l 
     } 
     set { 
      __maxLengths[self] = newValue 
      addTarget(self, action: #selector(fix), for: .editingChanged) 
     } 
    } 
    func fix(textField: UITextField) { 
     let t = textField.text 
     textField.text = t?.safelyLimitedTo(length: maxLength) 
    } 
} 

extension String 
{ 
    func safelyLimitedTo(length n: Int)->String { 
     let c = self.characters 
     if (c.count <= n) { return self } 
     return String(Array(c).prefix(upTo: n)) 
    } 
} 


class ViewController: UIViewController { 

    @IBOutlet var input1: UITextField! 
    @IBOutlet var input2: UITextField! 
    @IBOutlet var input3: UITextField! 
    @IBOutlet var input4: UITextField! 
    @IBOutlet var input5: UITextField! 
    @IBOutlet var input6: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     setup() 
     // Do any additional setup after loading the view. 
    } 

    func setup() { 
     input1.tag = 1 
     input2.tag = 2 
     input3.tag = 3 
     input4.tag = 4 
     input5.tag = 5 
     input6.tag = 6 

     input1.addTarget(self, action: #selector(textChanged), for: .editingChanged) 
     input2.addTarget(self, action: #selector(textChanged), for: .editingChanged) 
     input3.addTarget(self, action: #selector(textChanged), for: .editingChanged) 
     input4.addTarget(self, action: #selector(textChanged), for: .editingChanged) 
     input5.addTarget(self, action: #selector(textChanged), for: .editingChanged) 
     input6.addTarget(self, action: #selector(textChanged), for: .editingChanged) 
    } 

    func textChanged(sender: UITextField) { 
     if (sender.text?.characters.count)! == 1 { 

      let nextField = sender.superview?.viewWithTag(sender.tag + 1) as UIResponder! 
      nextField?.becomeFirstResponder() 
     } else if (sender.text?.characters.count)! == 0 { 
      let nextField = sender.superview?.viewWithTag(sender.tag - 1) as UIResponder! 
      nextField?.becomeFirstResponder() 
     } 


    } 


} 
関連する問題