[Swift] UITextViewでカーソルのある行のテキストを取得する

2017年9月15日(更新: 2017年9月15日)

Swift で複数の行に渡る長いテキストを扱うテキストエリアを作成するには UITextView を使用します。

今回は UITextView によるテキストエリア内で、現在カーソルが置かれている一行分のテキストだけを取得する方法について紹介します。

テキストエリアの行を取得するサンプル

テキストエリアと、行を取得するためのボタンのみがあるサンプルアプリのソースコードです。

プロジェクトを「Single View Application」のテンプレートで作成後にできる ViewController.swift を以下のように書き換えます。

import UIKit

class ViewController: UIViewController {

    // ステータスバーの高さ
    let statusBarHeight = UIApplication.shared.statusBarFrame.height
    
    // テキストエリアのインスタンス
    let textView = UITextView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = UIColor.lightGray
        
        // テキストエリアの設定
        textView.frame = CGRect(x: 0, y: statusBarHeight, width: self.view.frame.width, height: 200)
        textView.text = "UITextView を使えば、数行に渡るテキストを\n表示・編集することができます。\n長いテキストを扱うアプリに使用します。"
        self.view.addSubview(textView)
        
        // 行を取得するボタン
        let button = UIButton(type: .system)
        button.setTitle("行を取得", for: .normal)
        button.addTarget(self, action: #selector(self.getCurrentLine), for: .touchUpInside)
        button.sizeToFit()
        button.center.x = self.view.center.x
        button.center.y = 300
        self.view.addSubview(button)
    }
    
    // カーソルのある行のテキストのみを取得
    func getCurrentLine() {

        let allText = textView.text! as NSString
        let currentLine = allText.substring(with: allText.lineRange(for: textView.selectedRange))
        
        print(currentLine)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

サンプルの実行例です。テキストエリア内の3行のテキストのうちのどこかにカーソルを置いてボタンを押すと、その行のテキストがコンソールに表示されます。

UITextViewの中の行のテキストを取得するサンプル

実際に行のテキストを取得するコードは以下の部分です。

    // カーソルのある行のテキストのみを取得
    func getCurrentLine() {

        let allText = textView.text! as NSString
        let currentLine = allText.substring(with: allText.lineRange(for: textView.selectedRange))
        
        print(currentLine)
    }

テキストエリアの全てのテキストを NSString に変換して、行のレンジ(NSRange)を取得するメソッド lineRange と、レンジによってテキストを抽出するメソッド substring を使用できるようにしています。

その後、抽出した行のテキストを表示しています。

以上が、UITextViewでカーソルのある行のテキストを取得する方法です。

コメントを残す

メールアドレスが公開されることはありません。