質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.38%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1508閲覧

TextView内の検索機能を実装したい。(Swift)

SdMzauVsdtgq81B

総合スコア1

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/06/08 02:35

編集2021/06/08 02:36

前提・実現したいこと

textViewで検索した文字列を選択したい。そのときに、検索箇所を移動したい。

実現したいことの詳細

以下のサイトを見て、textviewの検索機能を実装しました。
ttps://qiita.com/jcomeme/items/18ebe229876d15f3d7bf(文頭にhを足してください。)
ただ、検索結果が複数ある場合に、別の検索箇所に選択範囲を移す機能の実装の仕方がわかりません。stackoverflowなどで実装方法を探しましたが、見つけられませんでした。どのようにしたら別の検索箇所に移動できるか、わかる方はいませんか?

該当のソースコード

swift

1 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 2 var resultRangeArray = [Range<String.Index>]() 3 4 let str = textView.text //本文 5 let word = searchBar.text 6 7 var nextRange = str.startIndex..<str.endIndex //文字列全体をRange<String.Index>として検索対象に設定 8 while let range = str.range(of: word, options: [.caseInsensitive], range: nextRange, locale: Locale.current) { 9 resultRangeArray.append(range) //検索結果を配列に格納 10 nextRange = range.upperBound..<str.endIndex //見つかった文字列の後から本文の最後までで検索対象を設定 11 } 12 13 let index = 0 14 let range = resultRangeArray[index] 15 16 /* range:Range<String.Index>からオフセットと長さを整数で取得 */ 17 let offset = range.lowerBound.utf16Offset(in: textView.text) 18 let length = str[range].count 19 20 /* offsetとlengthからUITextPositionを作成 */ 21 let startPosition = textView.position(from: textView.beginningOfDocument, offset: offset) 22 let endPosition = textView.position(from: textView.beginningOfDocument, offset: (offset + length)) 23 24 /* UITextPositionからUITextRangeを作成 */ 25 textRange = textView.textRange(from: startPosition!, to: endPosition!) 26 27 textView.selectedTextRange = textRange 28 textView.becomeFirstResponder() 29 textView.scrollRangeToVisible(NSMakeRange(offset, length)) 30 31 }

試したこと

ボタンを作って、indexの数を増減させたりしましたが、うまくできませんでした。

補足情報(FW/ツールのバージョンなど)

Swift

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/06/08 03:39

nextRange を文字列全体ではなく、現在の選択範囲の後ろにすれば良いのでは。
SdMzauVsdtgq81B

2021/06/08 04:38

コメントありがとうございます。自己解決しました。
guest

回答1

0

自己解決

resultRangeArray.countの範囲内で、indexの増減をして、resultRangeArrayを取得することで実装できました。

投稿2021/06/08 04:39

SdMzauVsdtgq81B

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.38%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問