少し調べてみると、以下の解決策で新しい文字列を等間隔で自動的に追加/削除できると思います。
説明:
1。新しい文字を挿入します
Text : XXXX-XXXX-
Location : 0123456789
Objective : We've to insert new character's at locations 4,9,14,19,etc. Since equal spacing should be 4.
Let's assume y = The location where the new charcter should be inserted,
z = Any positive value i.e.,[4 in our scenario] and
x = 1,2,3,...,n
Then,
=> zx + x - 1 = y e.g., [ 4 * 1 + (1-1) = 4 ; 4 * 2 + (2 - 1) = 9 ; etc. ]
=> x(z + 1) - 1 = y
=> x(z + 1) = (1 + y)
=> ***x = (1 + y) % (z + 1)*** e.g., [ x = (1 + 4) % (4 + 1) => 0; x = (1 + 9) % (4 + 1) => 0 ]
The reason behind finding 'x' leads to dynamic calculation, because we can find y, If we've 'z' but the ultimate objective is to find the sequence 'x'. Of course with this equation we may manipulate it in different ways to achieve many solutions but it is one of them.
2. Removing two characters (-X) at single instance while 'delete' keystroke
Text : XXXX-XXXX-
Location : 0123456789
Objective : We've to remove double string when deleting keystroke pressed at location 5,10,15,etc. i.e., The character prefixed with customized space indicator
Note: 'y' can't be zero
=> zx + x = y e.g., [ 4 * 1 + 1 = 5 ; 4 * 2 + 2 = 10; 4 * 3 + 3 = 15; etc.]
=> x(z + 1) = y
=> ***x = y % (z + 1)*** e.g., [ x = (5 % (4 + 1)) = 0; x = (10 % (4 + 1)) = 0; etc. ]
Swiftのソリューション:
let z = 4, intervalString = " "
func canInsert(atLocation y:Int) -> Bool { return ((1 + y)%(z + 1) == 0) ? true : false }
func canRemove(atLocation y:Int) -> Bool { return (y != 0) ? (y%(z + 1) == 0) : false }
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let nsText = textField.text! as NSString
if range.length == 0 && canInsert(atLocation: range.location) {
textField.text! = textField.text! + intervalString + string
return false
}
if range.length == 1 && canRemove(atLocation: range.location) {
textField.text! = nsText.stringByReplacingCharactersInRange(NSMakeRange(range.location-1, 2), withString: "")
return false
}
return true
}