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

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

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

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

Q&A

解決済

1回答

1171閲覧

UIButtomの画像を変更しようとすると、アプリが落ちてしまう

_utah

総合スコア20

Swift

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

0グッド

0クリップ

投稿2017/02/03 06:21

編集2017/02/09 01:49

初めての投稿になります。

presentViewControllerを呼び、モーダルを表示させ、そのモーダルに配置してあるボタン(containerView)を押下すると、モーダル側からモーダル呼び出し元にあるメゾッドを呼び出し、モーダルを閉じるという処理を書いています。

そのメゾッドの中で、呼び出し元にあるボタンの画像を変更するため、ボタンの中身にアクセスする必要があるのですが、アクセスするとアプリが落ちてしまいます。

おそらく、画面遷移中の何かしらが原因で、ボタンそのものがアクセス出来ない状態(nilなど)になってしまい、落ちていると思われるのですが、原因と対処方がわからない状態です。

ご教授お願いいたします。

swift

1 2 3class OriginViewController : UIViewControllerTransitioningDelegate{ 4 5// 画像が変わるボタン 6@IBOutlet var _createActionsButton: UIButton! 7 8// 上記のボタンと同じ 9@IBAction func moveModalAction(sender: AnyObject) { 10 11// ストーリーボード指定 12let storyboard = UIStoryboard(name : "MainStoryboard", bundle: nil) 13 14// 次のシーンに移動 15let nvc = storyboard.instantiateViewControllerWithIdentifier("TransitionViewController") 16navigationController?.pushViewController(nvc, animated: true) 17self.presentViewController(nvc, animated: true, completion: nil) 18 } 19 20// モーダル側から呼び出される 21func CalledToModalMethod(){ 22 23// 画像作成 24let newButtonImage : UIImage = UIImage(named : "ABCImage")! 25 26// ↓ここで落ちる 27**self._createActionsButton**.setBackgroundImage(newButtonImage,forState: .Normal) 28} 29} 30

swift

1class TransitionViewController : UIViewController{}

swift

1class TransitionViewContainerController : UIViewController{ 2 3// モーダル画面のボタン押下 4@IBAction func pushButton(sender: AnyObject) { 5 6// モーダル削除 7self.dismissViewControllerAnimated(true, completion: nil) 8 9// 呼び出し元関数を呼ぶ 10_ = NSTimer.scheduledTimerWithTimeInterval(0.0, target : OriginViewController(), selector : #selector(OriginViewController.CalledToModalMethod), userInfo : nil, repeats : false) 11 } 12}

###試したこと
画像の切り替えはもともと出来ており、CalledToModalMethod場所以外では、正常に切り替わることを確認済み。

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode7.3.1
言語swift2.2

以上になります。

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

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

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

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

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

t_obara

2017/02/03 08:47

ちなみに、モーダル画面が表示されている時に、そのボタンは見えているのですか?
_utah

2017/02/03 08:54

質問ありがとうございます。見えています。ボタンは画面端に描画している状態で、モーダルの画面は透過色で、中央部分のみcontainerViewでpushButtonが配置されている状態です。
guest

回答1

0

ベストアンサー

的を得ていない回答かもしれないですが、書かせてもらいます。

swift

1NSTimer.scheduledTimerWithTimeInterval(0.0, target : OriginViewController(), selector : #selector(OriginViewController.CalledToModalMethod), userInfo : nil, repeats : false)

上記のコード「target」の箇所ですが、インスタンスは、呼び出し元と同じ参照でしょうか?
コード拝見したところ、新規に生成したオブジェクトに対してタイマーを発火しているように見えます。

また、ボタンのオブジェクトは、IBOutletで接続しているため、ストーリボードから生成しないとボタンオブジェクトにはnilが代入されます。

投稿2017/02/05 06:55

Asunaro

総合スコア104

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

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

Asunaro

2017/02/05 06:58

呼び出し元のViewControllerのオブジェクトを取得したい場合は、下記プロパティーから取得できます。 parentViewController
_utah

2017/02/06 02:16

プログラム初心者ですので、変なことを言っていたら、申し訳ありません。 上記のコード「target」の箇所ですが、インスタンスは、呼び出し元と同じ参照でしょうか? →targetの部分には、呼び出したいメゾッド(関数)のあるコントローラ名を書くものだと思い、OriginViewController()を書いております。 コード拝見したところ、新規に生成したオブジェクトに対してタイマーを発火しているように見えます。 →その認識であっております。新たにTimerを生成し、発火させています。 また、ボタンのオブジェクトは、IBOutletで接続しているため、ストーリボードから生成しないとボタンオブジェクトにはnilが代入されます。 →ストーリーボードから生成しております。モーダルに飛ぶまでは、きちんとした(nilではない)値が入っているのを確認しております。モーダルから帰ってきた場合のみ、参照できない状態になってしまいます。 parentViewController→ こちらは、使用したことがありませんので、使用してみます。
Asunaro

2017/02/06 03:05

伝え方が悪くて申し訳ありません。 伝えたかったのは、モーダルを呼び出したOriginViewControllerとタイマー発火で呼び出しているOriginViewControllerの実体が違うのではとおもいます。
_utah

2017/02/06 03:19

target : OriginViewController() →こちらの意味ですが、上記でも書いたようにコントローラ名を書く場所であると思っておりました。OriginViewController()という表記で、新しくOriginViewControllerを作っているのであれば、確かに、元々のOriginViewControllerとは違うものになりますね! 参照できない理由が分かった気がします。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問