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

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

ただいまの
回答率

89.63%

【Xcode,Swift】Buttonをタップしたら、Thread 1: signal SIGABRTが出てきた

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,003

nekokichi

score 33

swift4
xcode9

ボタンをタップしたら、突然Thread 1: signal SIGABRTが出ました。
全部のOutletとActionの紐付けを解除し、もう1度つなぎなおしました。
変数名も一部前と変更しました。
しかし、解決しません。

import UIKit

class ResultViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        displayresult()
        result()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBOutlet weak var PLAYERLabel: UILabel!

    @IBOutlet weak var CPUULabel: UILabel!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "WIN" {
            let gameover_instance = segue.destination as! GameOverViewController
            self.score = 1
            gameover_instance.Score += self.score
        }

    }


    //勝敗の判定を表す変数
    var winorlose = ""

    //スコアを保持する変数
    var score = 0

    //ChoiceHandViewControllerから渡される値を格納する変数
    var Player_Hand = ""
    var CPU_Hand = ""

    //両者の手を表示
    func displayresult() {
        //プレイヤーの手を表示
        PLAYERLabel.text = Player_Hand
        //CPUの手を表示
        CPUULabel.text = CPU_Hand
    }

    //勝敗を判定する処理
    func result() {
        if Player_Hand == CPU_Hand {
            winorlose = "lose"
            print("bbbb")
        } else {
            winorlose = "win"
            print("aaaa")
        }
    }


    //プレイヤーが勝ちなら前画面に戻る、負けならゲーム終了
    @IBAction func ChangeViewButton(_ sender: Any) {
        if winorlose == "win" {
            performSegue(withIdentifier: "WIN", sender: nil)
        } else if winorlose == "lose" {
            performSegue(withIdentifier: "LOSE", sender: nil)
        }
    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}
import UIKit

class GameOverViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        display_score()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBOutlet weak var ScoreLabel: UILabel!


    //ResultViewControllerで渡されたscoreを格納する変数
    var Score = 0

    //勝った回数を表示
    func display_score() {
        ScoreLabel.text = "\(Score)"
    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}


下部がMainStoryBoard、コンソール、エラー箇所の画像です。
どこが原因なのか教えていただけないでしょうか?
よろしくお願いします。

イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明

「追記」

上記のエラーコードがこちらです。

Could not cast value of type 'MyAcchiMuiteHoi.ChoiceHandViewController' 
(0x108a8ba50) to 'MyAcchiMuiteHoi.GameOverViewController' (0x108a8b990). 

2018-08-22 09:38:55.508647+0900 MyAcchiMuiteHoi[8071:235142]
 Could not cast value of type 'MyAcchiMuiteHoi.ChoiceHandViewController' 
(0x108a8ba50) to 'MyAcchiMuiteHoi.GameOverViewController' (0x108a8b990). (lldb)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • fuzzball

    2018/08/22 10:03 編集

    エラーを見ると、ChoiceHandViewControllerに遷移しようとしていますが?(print追加前のログで十分です。print(segue.destination)を追加したときのログは不要なので削除して下さい)

    キャンセル

  • nekokichi

    2018/08/22 10:23

    はい、もしwinorlose変数の値が"WIN"(Player_HandとCPU_Handが一致しない場合)なら、ChoiceHandViewControllerに遷移するようになってます。

    キャンセル

  • nekokichi

    2018/08/22 10:24

    今シミュレータで試したのですが、GameOverVIewControllerへ遷移する場合は正常に動作します。おそらく、ChoiceViewControllerへ遷移する際の処理に問題があるかと思います。

    キャンセル

回答 1

checkベストアンサー

0

//ResultViewController / prepare(for:sender:)
let gameover_instance = segue.destination as! GameOverViewController

segue.destinationには遷移先ViewControllerのインスタンスが入っていますので、今回の場合はChoiceHandViewControllerが入っています。それをGameOverViewControllerにキャストしようとして失敗し落ちています。

そもそも、この時点でGameOverViewControllerのインスタンスは生成されていません。
処理の流れを見直して下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/22 11:01

    Result..Controllerのscore変数をGame..Controllerだけでやり取りするのではなく、

    Result..Controllerで勝敗を判定して勝ったらscoreに1を追加し、
    Choice..ControllerのSCORE変数に渡して、再びResult..Controllerに遷移する際に、SCORE変数の値をscore変数に渡し、
    もし勝敗が負けの場合、Result..Controllerのscore変数をGame..ControllerのScore変数に渡しました。

    つまり、Result..Controllerで取得したscoreの値を"WIN"の遷移先と共有し、最終的にLOSEの遷移先へと渡せばよかったみたいです。

    ここまで付き合っていただきありがとうございました。
    なんども助けていただき助かりました。

    キャンセル

  • 2018/08/22 11:13

    少々まどろっこしいですが、とりあえずはそれでいいと思います。

    スコア変数剥き出しなのもアレなので、スコア管理クラスを作ってViewController間で持ち回るとか、持ち回らずにシングルトンにするとか。(シングルトンに抵抗がなければ)

    キャンセル

  • 2018/08/22 11:16

    おっしゃる通り、score,Score,SCOREと3つも変数を作り、いちいち値を渡すのは非効率だと思います。
    できれば、まとめて管理するとか、シンプルな処理で実現したいです。
    一応解決したので、これで終了します。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる