🍄

SwiftUIのTextEditorに30文字しか入力できない?と思ったら…

に公開

🧐 なにが起こったのか

前回作成したレビュー評価画面を実機で動かしていたところ、あることに気が付きました。

↓ 前回の記事はこちら
https://zenn.dev/funya3/articles/e402b65ab27c9b

😥 ひらがなもアルファベットも30文字しか入力できない?

どうやら文字が30文字しか入力できないようです。
実際に文字を入力してみたGIFはこちらです。

ひらがなを入力した場合 アルファベットを入力した場合
ひらがな アルファベット

🧑‍💻 使用していたコードを再確認

以下が、実際に使用したレビュー評価画面のコードです。
TextEditor を使っておりますが、文字数制限をしている記述は見当たりません。

コード全体
import SwiftUI

struct RatingDialogView: View {
    @Binding var isPresented: Bool
    @State private var rating: Int = 0
    @State private var inputText = ""

    var body: some View {
        VStack(spacing: 16) {
            Text("ドライバーの評価をお願いします")
                .font(.headline)

            Image(systemName: "person.crop.circle.fill")
                .resizable()
                .frame(width: 80, height: 80)
                .clipShape(Circle())
                .foregroundColor(.gray)

            Text("ダミー会社名株式会社")
                .font(.body)
                .foregroundColor(.secondary)

            Divider()

            Text("今回の満足度と評価をご入力ください。")
                .font(.callout)

            HStack(spacing: 8) {
                ForEach(1...5, id: \.self) { index in
                    Image(systemName: rating >= index ? "star.fill" : "star")
                        .resizable()
                        .frame(width: 28, height: 28)
                        .foregroundColor(rating >= index ? .yellow : .gray)
                        .onTapGesture {
                            rating = index
                        }
                }
            }

            TextEditor(text: $inputText)
                .frame(height: 100)
                .padding(4)
                .overlay(
                    RoundedRectangle(cornerRadius: 8)
                        .stroke(Color.gray, lineWidth: 1)
                )
                .overlay(alignment: .topLeading) {
                    if inputText.isEmpty {
                        Text("運転が丁寧で親切なドライバーさんでした")
                            .foregroundColor(Color(uiColor: .placeholderText))
                            .padding(8)
                    }
                }

            Button(action: {
                print("評価送信: \(rating) ★, コメント: \(inputText)")
                isPresented = false // 閉じる
            }) {
                Text("評価する")
                    .frame(maxWidth: .infinity)
                    .padding()
                    .background(rating > 0 ? Color.blue : Color.gray)
                    .foregroundColor(.white)
                    .cornerRadius(8)
            }
            .disabled(rating == 0)
        }
        .padding()
        .background(Color.white)
        .cornerRadius(16)
        .shadow(radius: 10)
        .padding()
    }
}

#Preview {
    RatingDialogView(isPresented: .constant(true))
}

もし、30文字しか入力できないのであれば、例えば下記のようなコードが書かれていることが考えられました。
しかし、上記のコードを見てもcount > 30箇所はどこにも見当たりません。
では、なぜ30文字しか入力できなかったのでしょうか?

var other: String {
    didSet {
        if other.count > 30 {
            other = String(other.prefix(30))
        }
    }
}

🍄 原因は「Simeji」キーボードだった!

実は私、普段はSimejiというサードパーティ製の日本語入力キーボードを使っています。
↓これが原因でした。
https://apps.apple.com/jp/app/simeji-フォントから顔文字-絵文字までaiキーボード/id899997582

他のキーボードで試してみた結果

iPhone標準のキーボードやgrammalyというキーボードを使ってみたところ、30文字以上入力できることが確認できました。

iphone標準キーボード grammalyキーボード

さらに深掘り:標準メモ帳で検証

SimejiでiPhoneのメモ帳に文字を入力してみた結果はこちらです。
確定ボタンを押せば、30文字以上の入力が可能でした。
つまり、未確定の状態だと入力上限に制限がかかってしまっていたようです。

メモ帳 + Simeji(未確定) 30文字入力後に「確定」

結論まとめ

  • SwiftUIの TextEditor に文字数制限コードは書いていない
  • それでも30文字しか入力できなかったのはSimejiキーボードの挙動によるもの
  • 未確定のままだと文字入力が途中で止まることがある
  • 「確定」ボタンを押せば問題なく入力できる

最後に:同じ症状で困っている方へ

もしTextEditorTextFieldに制限があるように見えたら、
サードパーティ製キーボードの影響を疑ってみると良いかもしれません。


ここまで読んでいただきありがとうございました!
同じ悩みを持つ方の参考になれば嬉しいです🙇‍♀️

Discussion