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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

735閲覧

Swift3 UITextViewにボタンで文字列を挿入

mitci

総合スコア37

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/09/16 10:46

編集2017/09/16 10:47

###前提・実現したいこと
あらかじめ複数行のテキストが入っているUITextViewのテキストに
UIButtonを押すと任意の文字列を任意の場所に挿入する
という動作を実現したいです。

詳しく言うと、
あらかじめ入れたテキストの行頭に文字列を挿入し、
次の行の行頭へ移動し、またボタンを押すとそこへ任意の文字を挿入し、さらに次の行頭へカーソルを移動しておく
という動作です。


たとえば以下の文章が入っているとします。

こんにちは。わたしはロイメン大学助教授のアトラと申します。

年齢は45歳です。
人種問題について研究しております。

UIButtonを押す -> 任意の文字列「xx行目ですよ:」を挿入

1行目ですよ:こんにちは。わたしはロイメン大学助教授のアトラと申します。

年齢は45歳です。
人種問題について研究しております。

もう一度ボタンを押すと、

1行目ですよ:こんにちは。わたしはロイメン大学助教授のアトラと申します。

2行目ですよ:年齢は45歳です。
人種問題について研究しております。

と、挿入する場所を移動した上で任意のテキストを挿入する、という動作です。

###補足情報
Swift3 Xcode8
ちなみに、挿入する任意の文字列はMPMusicPlayerControllerのnowPlayingItemからとってきた動的な文字列です。
カスタムキーボードで実装ができるかと思ったのですが、
カスタムキーボードはMPMusicPlayerControllerから値を持ってこられないようなので、擬似的なオリジナルキーボードとしてUIButtonを置いてテキストに挿入できたらなぁ、と思った次第です。

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

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

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

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

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

Stripe

2017/09/16 11:42

テキストの挿入位置は、どのように管理するつもりですか?
mitci

2017/09/16 12:28

挿入位置は最初がテキストの冒頭で、自動で次の行の最初(処理的には文字列を挿入した行の最後に移動し、さらにカーソルを1文字分動かす)にしたいです
Stripe

2017/09/16 12:59

テキストが編集された結果、挿入位置が変化するケースもあると思いますが?
Stripe

2017/09/16 13:01

それから、テキストの挿入に合わせて、カーソルも移動するんですか?
mitci

2017/09/16 13:29

実現したいのはワンボタンでテキストの挿入かつカーソル移動です。カスタムキーボードではそれができるので、通常のアプリでもできればな、と思いました。また、テキストはすべて各行の最初に挿入するので「挿入した文字列から後ろにある文字数カーソルを移動」または「\nまで移動」で動的なテキストでも行末の位置は取れそうなので、あとはさらに一文字分移動して次の行の行頭へ移動させたいと思ってます。
Stripe

2017/09/16 13:38

つまり、テキストの挿入位置は現在のカーソル位置が影響するということですね? 「挿入位置は最初がテキストの冒頭で、自動で次の行の最初...」というのは違うということですね?
mitci

2017/09/16 14:09

そのように動いたかのように見える、という意味ですね、すいません。要するにあらかじめ用意してある複数行テキストの各行頭に文字列を連続的に挿入したいのです
Stripe

2017/09/16 14:22

行の先頭は複数あります。ボタンを押したときにどこの行頭に挿入するのか、その定義があいまいだとコードは書けません。
mitci

2017/09/16 14:28

テキストを挿入したらその行の次の行の一文字目の手前(Macでいうと↓キーで次の行に移動し、command + ←を押して一文字目の手前にカーソルを合わせたという感じ)です。
mitci

2017/09/16 14:33

まずUIButtonを押す -> 一行目の一文字目の手前にテキストを挿入 -> 自動でMacでいうところの「↓」キー、「command + ←」を実行 -> またUIButtonを押す -> テキストを挿入&「↓」キー「command + ←」 -> UIButtonを押す…の繰り返しになります
guest

回答1

0

自己解決

暫定的な回答ですが、
UITextViewに入っている文章を行ごとに配列に入れて、
すでに「x行目ですよ:」が挿入されている行の文章のみの配列(firstTextAry)をつくり、その数を保持したうえでその配列の全要素(全行)に改行を付け足してUITextView(この場合、testTextView)に表示させる。
そのあと、UIButtonで挿入したかった文字列を入れたあと、
「x行目ですよ:」がまだ挿入されていない行の配列をsuffixで割り出してからsliceArray型をArray型に.mapしてから、やはり改行を付与しつつtestTextViewに挿入する。

swift

1 currentTextStr = testTextView.text 2 testTextView.text = "" 3 textAry = textStr.components(separatedBy: CharacterSet.newlines) 4 firstTextAry = textAry.filter({$0.contains("行目ですよ")}) 5 firstAryCount = firstTextAry.count 6 firstTextAry.forEach({testTextView.insertText("\($0)\n")}) 7 8 testTextView.insertText(lineNumber) 9 10 textAry = textStr.components(separatedBy: CharacterSet.newlines) 11 secondAryCount = textAry.count - firstAryCount 12 secondTextAry = textAry.suffix(secondAryCount) 13 secondTextAryTrue = secondTextAry.map({$0}) 14 secondTextAryTrue.forEach({testTextView.insertText("\($0)\n")})

かなり不恰好ではありますが、
挿入したい部分の前後を特定の文字列で分けて、順番に書き直していくことで任意の位置を指定するという動作になりました。

投稿2017/09/18 06:18

mitci

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問