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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Swift

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

Q&A

1回答

2533閲覧

UIActivityIndicatorViewをクラス化?モジュール化?して複数ページに共通に埋め込みたい。(できればswiftで)

kento2543

総合スコア163

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Swift

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

0グッド

0クリップ

投稿2015/10/27 08:20

現在、独自でアプリを作っております。
(Swiftで実装、画面デザイン周りはStoryboardを用いてます。)

主にalamofire を用いて、通信する機能が多く、現在8ページにUIActivityIndicatorViewを埋め込んでおります。これからもページが増えてくるため、共通化の意味も込めて、クラス化?(モジュール化?)したいとおもっております。

しかし、以下の通り、alamofireの記述が途中に入ったりするため、共通化ができるのかどうか、今の自分の知識ではわかりませんでした。

@IBOutlet weak var myActivityIndicator: UIActivityIndicatorView! //インジケーター追加 myActivityIndicator.center = self.parentView.center //アニメーション開始 self.myActivityIndicator.startAnimating() self.parentView.addSubview(myActivityIndicator) // Alamofireでの通信 Alamofire.request(“APIの記述”).responseJSON { request, response, result in 記述 // アニメーション停止 self.myActivityIndicator.stopAnimating()

共通化したい項目は以下です。
・IBOutletでの紐付け(できれば)
・インジケーター追加
・アニメーション開始
・アニメーション停止

こういうのは出来るものなのでしょうか?

ご助言頂けますと幸いです。
宜しくお願いします。

UIActivityIndicatorViewについての記事
http://www.yoheim.net/blog.php?q=20120617

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

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

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

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

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

guest

回答1

0

UIActivityIndicatorViewを共通化されるのであればIBOutletではなくコードによる実装をお勧めします。
共通化されるということは、表示する色やStyle、場所も同じ場所だと思うのでStoryboardで全ての画面に同じレイアウトを設定する必要性は薄いからです。

簡単な共通化としてはextensionを利用すると良いです。
実装の一例を以下に挙げます。

Swift

1extension UIViewController { 2 // インジケーターのインスタンスを取得 3 func myIndicator() -> UIActivityIndicatorView { 4 let tag = 1234 5 6 // 追加済みの場合はそのインスタンスを返す 7 if let indicator = view.viewWithTag(tag) as? UIActivityIndicatorView { 8 return indicator 9 } 10 11 // 新規で作成 12 let newIndicator = UIActivityIndicatorView(activityIndicatorStyle: .Gray) 13 newIndicator.tag = 1234 14 return newIndicator 15 } 16 17 // インジケーターを追加 18 func addIndicator() { 19 let indicator = myIndicator() 20 21 // インジケーターの多重追加を防止 22 if indicator.superview != nil { 23 return 24 } 25 26 indicator.center = view.center 27 view.addSubview(indicator) 28 } 29 30 // インジケーターを削除 31 func removeIndicator() { 32 myIndicator().removeFromSuperview() 33 } 34 35 // インジケーターのアニメーション開始 36 func startIndicator() { 37 myIndicator().startAnimating() 38 } 39 40 // インジケーターのアニメーション停止 41 func stopIndicator() { 42 myIndicator().stopAnimating() 43 } 44}

画面によって細かい変更を与えたい場合は、メソッドに引数を追加して設定値を受け渡すようにすれば呼び分けも可能です。
是非、自分用に書き換えたりしてカスタムしてみてください。

投稿2015/10/30 03:05

TakutoNagano

総合スコア150

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

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

kento2543

2015/10/30 11:53

ご回答ありがとうございます。 確かにIBOutletではなくコードによる実装だと、共通化しやすそうですね。 今までは、あまり考えず、とりあえずIBOutletをつかってました・・・。 共有頂いたコードですが、これは、共通化をしたいViewControllerで、 以下のファンクションは少なくとも呼び出さなくてはいけないですよね? myIndicator addIndicator removeIndicator startIndicator stopIndicator 現実的に難しいのかもしれませんが、共通化用のViewController?を作り、 それをimportするだけですべて、 myIndicator addIndicator removeIndicator startIndicator stopIndicator をやってくれるようなものができればなと思っておりました。 まだまだ経験が浅いので絵空事なのかもしれませんが・・・
TakutoNagano

2015/11/04 01:15

myIndicator()は呼び出す必要ありません。 addIndicator()はstartIndicator()の中に含めてしまうように修正すれば呼び出す必要はありません。 removeIndicator()も同様です。 修正すれば、呼び出し側はstartIndicator()とstopIndicator()だけを呼び出す形にできます。 是非、挑戦してみてください。 共通用のViewControllerのimportで全て自動化することは、不可能ではないかもしれませがお勧めはしません。 インジケーターの処理と通信の実装が密結合になりすぎて、少し異なった動きにしたい場合に共通用ViewControllerの実装が邪魔になることが多々あります。 たとえば、インジケーターを表示せずに裏で通信処理をしたい場合など。 共通用ViewControllerの実装、いわゆるBaseViewControllerの実装についても技術者間で賛否が分かれるものです。 それぞれのメリット・デメリットを把握した上で、自分にとってより良い実装方法を模索されるのが良いでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問