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

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

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

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

Swift

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

Q&A

解決済

1回答

3650閲覧

swift3 文字を一文字づつ表示させたい

RieMatsui

総合スコア27

Xcode

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

Swift

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

0グッド

1クリップ

投稿2017/01/17 13:10

###textviewに一文字づつ表示させたい

RPGのゲームのようなものを作成しています。よく一文字づつ続けてセリフが出てくるような画面がありますが、timerクラスを使った反復処理を行うクラスファイルを作成し、ストーリーボードでclassをtextviewにクラスを設定しています。表示された文字を一文字づつ続けて表示するように設定したいです。

###発生している問題

文字送りはできるのですが、最初にtextviewの文字が全て表示されてから、文字送りがされてしまいます。またタイマーの停止処理ができずに永遠に文字送りがされてしまいます。

###該当のソースコード<swift3>

import UIKit class Timertext: UITextView{ var sentence:String! var titlestr:String! //表示文字のインデックス var idx = 0 //処理中フラグ var flgRun = false override func draw(_ rect: CGRect) { let tmr = Timer.scheduledTimer( timeInterval: 1, target: self, selector: #selector(tickTimer(_:)), userInfo: nil, repeats: true) tmr.fire() } func tickTimer(_ timer: Timer) { titlestr = self.text //表示文字インデックス判定 if idx < titlestr.characters.count { //対象文字列の取得 //let num01 = titlestr.characters.count - 1 let loc = titlestr.characters.index( titlestr.startIndex, offsetBy: idx) let loc1 = titlestr.characters.index( titlestr.startIndex, offsetBy: idx + 1) //画面表示 self.text = self.text + titlestr.substring( with: loc..<loc1) //表示文字のインデックスのインプリメント idx += 1 } else { self.text = titlestr //タイマーの停止 timer.invalidate() //処理中フラグOFF flgRun = false } } }

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode8 swift3

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

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

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

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

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

guest

回答1

0

ベストアンサー

StoryboardTextViewに初めから書いてある文字列を一文字づつ順に表示したい場合は、以下のコードできます。※ 『発生している問題』は解消していると思います。

swift

1import UIKit 2 3class Timertext: UITextView { 4 var titlestr:String! 5 6 //表示文字のインデックス 7 var idx = 0 8 9 //処理中フラグ 10 var flgRun = false 11 12 override func draw(_ rect: CGRect) { 13 14 let tmr = Timer.scheduledTimer( 15 timeInterval: 1, 16 target: self, 17 selector: #selector(tickTimer(_:)), 18 userInfo: nil, 19 repeats: true) 20 21 titlestr = self.text 22 self.text = "" 23 24 tmr.fire() 25 } 26 27 func tickTimer(_ timer: Timer) { 28 29 //表示文字インデックス判定 30 if idx < titlestr.characters.count { 31 self.text = titlestr.substring(to: titlestr.index(titlestr.startIndex, offsetBy: idx)) 32 33 //表示文字のインデックスのインプリメント 34 idx += 1 35 } else { 36 self.text = titlestr 37 //タイマーの停止 38 timer.invalidate() 39 40 //処理中フラグOFF 41 flgRun = false 42 } 43 } 44}

投稿2017/01/17 14:04

編集2017/01/17 14:12
_Kentarou

総合スコア8490

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

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

RieMatsui

2017/01/19 11:33 編集

いつも回答ありがとうございます。当初の問題は解決されましたが、メインのクラスのビューコントローラとNSObjectのクラスから引数でラベルに戻り値として取得したString型の値は文字送りとして反映されないため、もう少しクラスとメソッドに関する理解を深めたいと思います。強引にビューコントローラクラスに記載すれば目的は達成しますが、クラスに分けて処理をしたいので、もう少し勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問