はじめに
・textViewに文字を入力する際に文字制限をかけ、文字を超過した場合にkeybordが閉じるという挙動になります。
・超過後、再フォーカスした時にkeybordが閉じてしまうことを防ぐためにバックスペースの検知イベントを行います。
ViewControllerでの記述
textViewのdelegateメソッドでとりあえずコードを記述
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let char = text.cString(using: String.Encoding.utf8)!
let isBackSpace = strcmp(char, "\\b")
if textView.text.count >= 3 {
if (isBackSpace == -92) {
//backspaceAction...
return true
} else {
self.view.endEditing()
return false
}
}
return true
}
.cString()のメモ
cString()はswiftでのString型をchar型にエンコードして変数を扱うためのメソッドだと思います(?)。調べたところswiftには改行(\n)の様な特殊文字はバックスペースキーにはないため、バックスペースキーを押すとnilが返され検知することができなくなります。そのため、C言語にある特殊文字を利用し、エンコードして値を付加することでキーを検知できるようにする為だそうです。
.strcmp()のメモ
.strcmp()はStringCompareの略で、その名の通り2つの値を比較するためのメソッドです。上のコードの例では変数charと"\b"バックスペースの特殊文字を比較しています。
-92の意味とは
これは簡単にいうと確実にバックスペースキーを押したことを検知するための値です。swiftのバックスペースキーをC言語のcharにエンコードすると[0]という10進数の値が取得できます。それに対して"\b"は[92]という値が取得できます。
つまりバックスペースキーを押した時"0"と"92"を比較した時の差が-92という意味です。
最後に
文字コードらへんの事も理解していかないと簡潔なコードが書けないと実感した。ちゃんと勉強しよう。。
終わり。