LoginSignup
1
1

More than 5 years have passed since last update.

TextViewの文字制限を簡易的に実装する

Posted at

はじめに

・textViewに文字を入力する際に文字制限をかけ、文字を超過した場合にkeybordが閉じるという挙動になります。
・超過後、再フォーカスした時にkeybordが閉じてしまうことを防ぐためにバックスペースの検知イベントを行います。

ViewControllerでの記述

textViewのdelegateメソッドでとりあえずコードを記述

ViewController.swift
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という意味です。

最後に

文字コードらへんの事も理解していかないと簡潔なコードが書けないと実感した。ちゃんと勉強しよう。。
終わり。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1