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

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

ただいまの
回答率

90.53%

  • Swift

    8561questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 331

_utah

score 14

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

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

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

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

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

class OriginViewController : UIViewControllerTransitioningDelegate{

// 画像が変わるボタン
@IBOutlet var _createActionsButton: UIButton!

// 上記のボタンと同じ
@IBAction func moveModalAction(sender: AnyObject) {

// ストーリーボード指定
let storyboard = UIStoryboard(name : "MainStoryboard", bundle: nil)

// 次のシーンに移動
let nvc = storyboard.instantiateViewControllerWithIdentifier("TransitionViewController") 
navigationController?.pushViewController(nvc, animated: true)
self.presentViewController(nvc, animated: true, completion: nil)
    }

// モーダル側から呼び出される
func CalledToModalMethod(){

// 画像作成
let newButtonImage : UIImage = UIImage(named : "ABCImage")!         

// ↓ここで落ちる                   
**self._createActionsButton**.setBackgroundImage(newButtonImage,forState: .Normal)
}
}
class TransitionViewController : UIViewController{}
class TransitionViewContainerController : UIViewController{

// モーダル画面のボタン押下
@IBAction func pushButton(sender: AnyObject) {

// モーダル削除
self.dismissViewControllerAnimated(true, completion: nil)

// 呼び出し元関数を呼ぶ
_ = NSTimer.scheduledTimerWithTimeInterval(0.0, target : OriginViewController(), selector : #selector(OriginViewController.CalledToModalMethod), userInfo : nil, repeats : false)
    }
}

試したこと

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

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

Xcode7.3.1
言語swift2.2

以上になります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2017/02/03 17:47

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

    キャンセル

  • _utah

    2017/02/03 17:54

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/05 15:58

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

    parentViewController

    キャンセル

  • 2017/02/06 11:16

    プログラム初心者ですので、変なことを言っていたら、申し訳ありません。

    上記のコード「target」の箇所ですが、インスタンスは、呼び出し元と同じ参照でしょうか?
    →targetの部分には、呼び出したいメゾッド(関数)のあるコントローラ名を書くものだと思い、OriginViewController()を書いております。

    コード拝見したところ、新規に生成したオブジェクトに対してタイマーを発火しているように見えます。
    →その認識であっております。新たにTimerを生成し、発火させています。

    また、ボタンのオブジェクトは、IBOutletで接続しているため、ストーリボードから生成しないとボタンオブジェクトにはnilが代入されます。
    →ストーリーボードから生成しております。モーダルに飛ぶまでは、きちんとした(nilではない)値が入っているのを確認しております。モーダルから帰ってきた場合のみ、参照できない状態になってしまいます。

    parentViewController→
    こちらは、使用したことがありませんので、使用してみます。

    キャンセル

  • 2017/02/06 12:05

    伝え方が悪くて申し訳ありません。

    伝えたかったのは、モーダルを呼び出したOriginViewControllerとタイマー発火で呼び出しているOriginViewControllerの実体が違うのではとおもいます。

    キャンセル

  • 2017/02/06 12:19

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

    参照できない理由が分かった気がします。

    ありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Swift

    8561questions

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