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

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

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

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

Swift

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

Q&A

解決済

1回答

2969閲覧

swiftでLabelに文字送りアニメーションの実装

Honma

総合スコア25

Xcode

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

Swift

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

1グッド

0クリップ

投稿2017/06/28 06:42

編集2017/06/29 02:03

現在の状況(2017/6/29 11:00)

required init?(coder aDecoder: NSCoder) { // super.init(coder: aDecoder) super.init(text: self.text, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){ super.init(frame: .zero) if (nextLineKey != nil) { m_nextLineKey = nextLineKey } if (maxWidth != nil) { self.maxWidth = maxWidth } if (delayTime != nil) { self.m_delayTime = delayTime } if (mode != nil) { self.m_state = mode } if (fontsize != nil) { self.m_fontSize = fontsize } if (color != nil) { self.m_color = color } self.m_posX = posX self.m_posY = posY self.m_parentScene = addView drawText(text: text) } }

目的:
init(coder:)の中から必要なイニシャライザを呼びたい
状況:
super.initの引数部分でCannot invoke '〜' with an argument list of type '〜'がでる
引数に問題があるようなのだが、解決できない


スマートフォン向けアプリ開発を下記の環境で行っています。
Swift3.0.1
Xcode8.3.3

http://neight968.hatenablog.com/entry/2015/07/22/040538
上記URLのソースコードをクラス化しLabelに実装したい

ソース

このほかに必要であれば追加します

TextEscapement1.swift※文字数制限のため一部コメントを削除しています

import SpriteKit import UIKit enum eTextState: Int { case send = 0 case skip case remove } class TextEscapement1 : UILabel{ // メンバ変数 // テキストを文字送りするのに必要そうな変数 var m_text: String? var m_count: Int = 0 var m_strcount: CGFloat = 0.0 var m_delayTime: CGFloat = 0.1 var m_nextLineKey: Character = "嬲" var m_parentScene: SKScene? var m_fontSize: CGFloat = 12.0 var m_labelArray: Array<SKLabelNode> = [] // 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成) var x: UInt = 0 var y: UInt = 0 var maxWidth: UInt = 15 var m_posX: CGFloat? var m_posY: CGFloat? var m_color: UIColor = UIColor.black var m_drawEndFlag: Bool = false var m_state: eTextState = .send { willSet{} didSet{ switch m_state { case .send: self.m_delayTime = 0.1 case .skip: self.skipDraw(text: m_text) case .remove: self.remove() } } } // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン) convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!){ self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: nil) } // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字色) convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, color: UIColor!){ self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: color) } // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、横に書ける最大文字数) convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, maxWidth: UInt!){ self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: maxWidth, delayTime: nil, mode: nil, color: nil) } // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、モード) convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, mode: eTextState){ self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: mode, color: nil) } // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字表示の遅さ) convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, delayTime: CGFloat!){ self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: delayTime, mode: nil, color: nil) } init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){ if (nextLineKey != nil) { m_nextLineKey = nextLineKey } if (maxWidth != nil) { self.maxWidth = maxWidth } if (delayTime != nil) { self.m_delayTime = delayTime } if (mode != nil) { self.m_state = mode } if (fontsize != nil) { self.m_fontSize = fontsize } if (color != nil) { self.m_color = color } self.m_posX = posX self.m_posY = posY self.m_parentScene = addView drawText(text: text) // **ここでエラーが発生** } required init? (coder aDecoder: NSCoder) { fatalError("init(coder: has not been implemented)") } /// テキストの描画 private func drawText(text: String!){ // テキストの保管と文字数の取得 m_count = text.characters.count var text: String = text m_text = text if m_count == 0 { return } for n in 1 ... m_count { if m_state == .remove { return } let chara:Character = text.remove(at: text.startIndex) if chara == m_nextLineKey { y += 1 x = 0 } else if x > maxWidth { y += 1 x = 0 } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! { y += 1 x = 0 } x += 1 // ラベルノードの生成 var label: SKLabelNode = SKLabelNode(text: "\(chara)") label.fontSize = m_fontSize label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize)) label.alpha = 0.0 label.fontColor = m_color // ラベルの取り付け m_parentScene?.addChild(label) // ラベルの配列に登録 m_labelArray.append(label) // 表示する時間をずらすためのアクションの設定 let delay = SKAction.wait(forDuration: TimeInterval(m_delayTime * m_strcount)) let fadein = SKAction.fadeAlpha(by: 1.0, duration: 0.5) let seq = SKAction.sequence([delay, fadein]) label.run(seq) m_strcount += 1.0 } y = 0 x = 0 m_strcount = 0.0 } /// スキップモードの文字の描画 func skipDraw(text: String!){ if m_drawEndFlag { return } self.remove() // テキストの保管と文字数の取得 m_count = text.characters.count var text: String = text if m_count == 0 { return } for n in 1 ... m_count { if m_state == .remove { return } let chara:Character = text.remove(at: text.startIndex) if chara == m_nextLineKey { y += 1 x = 0 } else if x > maxWidth { y += 1 x = 0 } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! { y += 1 x = 0 } x += 1 // ラベルノードの生成 var label: SKLabelNode = SKLabelNode(text: "\(chara)") label.fontSize = m_fontSize label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize)) label.fontColor = m_color // ラベルの取り付け m_parentScene?.addChild(label) m_labelArray.append(label) m_strcount += 1.0 } y = 0 x = 0 m_strcount = 0.0 } /// 文字が全て表示されたかの確認 func checkDrawEnd(){ if m_labelArray.last?.alpha == 1.0 { m_drawEndFlag = true } } /// 描画モードの切り替え func changeState( mode: eTextState ){ self.m_state = mode } /// 描画の基本設定はそのままに、違う文へ切り替え func changeText(text: String!){ if m_drawEndFlag { self.remove() self.changeState( mode: .send ) drawText(text: text) } else { self.changeState( mode: .skip ) } } /// ラベルの取り外し func remove(){ while m_labelArray.count > 0 { m_labelArray.last?.removeFromParent() m_labelArray.removeLast() m_drawEndFlag = false } } }
tanakana👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

Storyboardからインスタンスを生成するときにinit(coder:)が呼ばれますので実装しないといけません。
NSObjectではなくUIViewを継承してみるとか(適当)

投稿2017/06/28 07:06

fuzzball

総合スコア16731

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

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

Honma

2017/06/28 07:11

fuzzball様 いつもお世話になっております。 ちょうど今そこに気づき、継承をUILabelにしてみたところ、 別エラーになりましたので、質問内容を大幅に変更してしまいました。すみません。 もし可能であれば再度エラー文を確認いただいてもよろしかったでしょうか。
fuzzball

2017/06/28 07:49

英語の質問になってしまっていますが、web翻訳してみる気はないのでしょうか?
Honma

2017/06/28 07:58

確かに現状このエラーの和訳は?のような質問になってしまっていますね・・・ 質問文を再修正(何を試したかなども含め)しますが、エラーの意味は把握しているつもりです。 それでも修正方法がわからなかったため質問させていただいている状況でした。
fuzzball

2017/06/28 08:08 編集

designated initializerを呼ぶ必要がある、と言われているのでdesignated initializerを呼んでください。 super.init(frame: .zero) で良いかと。
Honma

2017/06/28 08:21

具体的にご教示いただきありがとうございます!この記述でビルドOKでした。 ですが実行中に、今回エラーが出ていたinitのすぐ下のrequired init?(coder~のところで EXC_BAD_INSTRUCTIONエラー出てしまいました。 おそらく自身で自身を呼んでるとかそういう感じだと思うのでもう少し自分で調査してみます。
fuzzball

2017/06/28 08:23

fatalError()呼んでるので止まって当たり前です。
Honma

2017/06/28 08:32

なるほど、その通りですね・・・ ただこの記述required init?(coder aDecoder: NSCoder) { fatalError() } がないと今度はビルドエラー("必要なイニシャライザinitコーダは、uilabelのサブクラスによって提供される必要があります")が起きるので、無くせないなあという状況です・・・
fuzzball

2017/06/28 08:41

init(coder:)が悪いのではなく、fatalError()が悪いのです。 そもそも、init(coder:)の実装をするため(というか実装の手間を省くため)にUILabelを継承したはずです。 そこで super.init(coder: aDecoder) を呼んでください。
Honma

2017/06/28 10:35

1から10までご教示いただいて本当にありがとうございます! 初期化や継承関連の知識が足りていなくて申し訳ないです。もっと勉強します。 ただ、すいません、本件でもう少しだけお付き合いいただけないでしょうか。 エラーは全て解消されて画面遷移なども問題ないのですが、肝心の文字送りアニメーションが動いていません。(Labelに文章が静的表示されるだけ) class TextEscapement1の一番最初のvar宣言「var m_text: String?」 ここに文字送りしたい文字列データがこなければいけないらしいのですが、デバッグするとnilの状況です。 (labelのクラスにTextEscapement1を指定した以外は何もしていないので当然な気はするのですが) ただし、試しに「var m_text: String! = "テキスト"」として動かしてみても結果は変わりませんでした。 (肝心のdrawTextに入ることなく、required init?(coder aDecoder: NSCoder) {のあたりに飛んで全処理が完了する) 非常にお手数とは思いますが、なんとかアドバイスいただけないでしょうか。
fuzzball

2017/06/29 01:23

最初、回答に書いたように、Storyboardに配置した場合はinit(coder:)が呼ばれます。 その中から適当なイニシャライザを呼ぶか、init(coder:)内で同等の処理を行って下さい。 また、Storyboard上のラベルに設定したテキストはself.textですので、それをイニシャライザに渡すか、m_textに代入して下さい。
Honma

2017/06/29 01:59

回答いただきありがとうございます・・・! 言われている意味は今おそらく理解できたと思います。 m_textの件は大丈夫でした。 >その中から適当なイニシャライザを呼ぶか、init(coder:)内で同等の処理を行って下さい。 これについて、今試行錯誤しているのですが、まだ解決できていません・・・。 質問文冒頭に現在のソース(該当箇所のみ)を記載しますので見ていただけないでしょうか?
fuzzball

2017/06/29 02:04 編集

その前に確認したいのですが、初期化に必要なパラメータを全てStoryboard上で設定したいのでしょうか?Storyboardではなくコードで配置するのであれば今のコードでも動きそうな気がするのですが。(肝心の文字送り部分のコードは全然見ていませんが)
Honma

2017/06/29 02:07

コード上でも問題ありません。 constraintを使ってサイズが異なる端末でも同じような位置になるよう調整がしたかった程度です。(storyboardでやりたかったこと)
fuzzball

2017/06/29 02:13

ではまずコードで配置することを前提に実装してみては?
fuzzball

2017/06/29 02:59 編集

追加されたコードを見ましたが、init(coder:)の中で呼ぶinitはsuper.initではなく自分のinitですよ。 super(UILabel)にそんなイニシャライザは無いでしょ‥。
fuzzball

2017/06/29 04:04 編集

すみません、init(coder:)の中からself.initは呼べないみたいですね。 >>適当なイニシャライザを呼ぶか、init(coder:)内で同等の処理を行って下さい。 と書きましたが、イニシャライザを呼べないので、同等の処理を書くしかなさそうです。
Honma

2017/06/29 04:04

いえ、こちらこそ色々と試行錯誤してて中々返信できなくてすみません。 ちょっと技術的に手に負えなくなってきたので方向転換も検討中です。 ここまで丁寧に指導いただきありがとうございました!
fuzzball

2017/06/29 04:05

上の書き込み、少し編集しましたので確認しておいて下さい。 方向転換する方が良いと思います。あまり良い方向には進んでないように見えますので。
Honma

2017/06/29 04:07

確認しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問