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

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

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

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

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回答

493閲覧

LottieのアニメーションをModelクラスで実装

fox-10

総合スコア2

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

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クリップ

投稿2020/10/29 09:09

前提・実現したいこと

LottieのアニメーションをModelクラスで実装したいです。
Modelクラスの方でViewControllerクラスのViewの情報を含んだメソッドを記述する際はどのように記述すれば良いのでしょうか?
未熟者で恐れ入りますが、ご教授下されば幸いです。

発生している問題・エラーメッセージ

EXC_BAD_ACCESS (code=2, address=0x7ffee373af48)

該当のソースコード

swift5

1import Foundation 2import Lottie 3import UIKit 4 5class AnimationModel{ 6 7 let vc = RegisterViewController() 8 9 //LottieのAnimationViewを宣言 10 var animationView = AnimationView() 11 12 func startAnimation(){ 13 14 let animation = Animation.named("loading") 15 16 animationView.frame = CGRect(x: 0, y: 0, width: vc.view.frame.size.width, height: vc.view.frame.size.height/1.5) 17 18 animationView.animation = animation 19 animationView.contentMode = .scaleAspectFit 20 animationView.loopMode = .loop 21 animationView.play() 22 23 vc.view.addSubview(animationView) 24 } 25 26 func stopAnimation(){ 27 28 animationView.removeFromSuperview() 29 } 30}
import UIKit import Firebase import Lottie class RegisterViewController: UIViewController { let animation = AnimationModel() @IBOutlet weak var emailTextField: UITextField! @IBOutlet weak var passwordTextField: UITextField! //LottieのAnimationViewを宣言 //var animationView = AnimationView() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func registerNewUser(_ sender: Any) { //アニメーションのスタート animation.startAnimation() // //新規登録 // Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { (user, error) in // // if error != nil{ // print(error as Any) // }else{ // print("新規登録が完了しました") // // //アニメーションのストップ // self.stopAnimation() // } // } } // func startAnimation(){ // // let animation = Animation.named("loading") // // animationView.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height/1.5) // // animationView.animation = animation // animationView.contentMode = .scaleAspectFit // animationView.loopMode = .loop // animationView.play() // // view.addSubview(animationView) // } // // func stopAnimation(){ // // animationView.removeFromSuperview() // } }

試したこと

AnimationModelクラスにRegisterViewControllerクラスをインスタンス化させて実装したのですが、
インスタンス化の無限ループになり実装できませんでした。

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

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

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

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

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

TsukubaDepot

2020/10/29 11:09

最終的に実現されたいことがよく見えないのですが、具体的にはどのようなことを実現されたいのでしょうか。
fox-10

2020/10/29 12:48

言葉足らずで申し訳ございません。 ローディングをするアニメーションの処理を複数のクラスで使いたいため、このローディングアニメーションの処理をViewControllerクラスとは別のクラス(Modelクラス)に記述して、複数のViewControllerクラスで使いたいというのが目標になります。
guest

回答1

0

ベストアンサー

あくまでも一例ですが、

Swift

1import UIKit 2import Lottie 3 4class AnimationModel { 5 var view: AnimationView 6 7 init() { 8 view = AnimationView() 9 } 10 11 convenience init?(name: String, frame: CGRect) { 12 self.init() 13 guard let animation = Animation.named(name) else { 14 return nil 15 } 16 17 self.view = AnimationView() 18 self.view.frame = frame 19 self.view.animation = animation 20 self.view.contentMode = .scaleAspectFit 21 self.view.loopMode = .loop 22 } 23 24 convenience init?(name: String, frame: CGRect, to superView: UIViewController) { 25 self.init(name: name, frame: frame) 26 27 superView.view.addSubview(view) 28 } 29 30 func startAnimation(){ 31 32 view.play() 33 } 34 35 func stopAnimation(){ 36 view.stop() 37 } 38 39 func removeAnimation() { 40 view.removeFromSuperview() 41 } 42}

このような感じでモデルを定義し、

Swift

1class ViewController: UIViewController { 2 var animation = AnimationModel() 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 7 if let anim = AnimationModel(name: "loading", frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height/1.5), to: self) { 8 animation = anim 9 } else { 10 // name で指定したファイルが見つからなければ強制終了 11 fatalError("cannot find animation.") 12 } 13 } 14 15 override func viewWillAppear(_ animated: Bool) { 16 super.viewWillAppear(animated) 17 18 animation.startAnimation() 19 20 // 5秒後にアニメーションを終了させる 21 DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { 22 self.animation.stopAnimation() 23 } 24 } 25}

このような感じで self (ViewController 自身)を渡してあげるようにすれば実現することは可能ですが、この後 Model 内部で ViewController のインスタンス自身を保持するようなことがあれば循環参照になる可能性もありますので、より慎重に設計する必要があるかと思います。

投稿2020/10/30 23:50

TsukubaDepot

総合スコア5086

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

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

fox-10

2020/11/01 18:42

無事実装できました????‍♀️ self(ViewController 自身)を渡すというのが盲点でした。 非常に参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問