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

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

ただいまの
回答率

90.35%

  • Swift

    7644questions

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

  • Xcode

    4317questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

iosアプリ開発でランダムに画面遷移をしたい

解決済

回答 2

投稿

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

sifa

score 3

 前提・実現したいこと

現在クイズのアプリを作っています。
そこでランダムで問題が出てくるようにしたいです。

前提として、ただのクイズ問題ではなく、例えば将棋の(実際には将棋ではないのですがわかりやすくするために将棋とします)クイズのように将棋の盤面を画像として配置しており次の一手はどうするか?というような問題です。

問題自体は二択問題でどちらかのボタン(例えば「歩を動かす」or「角を動かす」のように画面にボタンを配置しています)を押すと正解か不正解が表示され「次の問題へ」のボタンが現れます。この流れで10問ほど作成します。

swiftやxcodeは初心者なのでとりあえずセグエを用いてこの流れで数問作ったのですが、この状態だと常に同じ順番で出題されます(画面はコピペしてviewcontorollerを画面分用い、二択のボタンと盤面の画像とラベル等部品とコードの接続のみ変えている状態です。この方法もあっているのか自信ありません)。

なので問題をランダムで出題されたり、例えば問題自体は30問ほど用意しておきその中の10問をランダムで出題する、というような流れにしたいです。また正解数をカウントして最後に表示するというのもできればやりたいです。

どのように実装すれば良いのでしょうか。
よろしくお願いします。

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

環境はswift4,Xcode9です

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

1問ずつViewControllerを作っていると問題数が多くなるにつれて大変になってくると思うので
ViewControllerはひとつにして中のViewの内容だけを変えるなどしてみると良いかもしれません。
とりあえず問題のパターンはひとつ、例のような将棋の次の一手、ボタンは2個しかないと仮定します。(複数の場合は問題パターンによっても表示を変えるような仕組みを考える必要があります。

画像、回答1、回答2がワンセットになったようなクラスや配列を作る。
それを問題数分用意して配列に格納しておく。

初回読み込み時または回答ボタンが押された後、乱数を使用して問題配列から問題クラスを取り出す。
取り出した問題配列から画像をImageViewにセット、回答の文字をButtonにセットする。
そうすると新しい問題が表示できる状態になると思います。

一度質問した問題を表示させない方法としては問題配列から一度使用したものは削除してしまう
解答済みフラグを用意してそのフラグがたっていないものだけを取り出すように作るなどが考えられると思います。

あとは今のように全てViewControllerにしてしまうとしてもstoryboardでは画面数が多いものや遷移が複雑なものには個人的には向いていないと思いますのでxibを利用してViewControllerを作りコードで画面遷移するような方法が良いと思います。
コードで遷移させたいViewControllerをnewしてランダムで遷移させるとstoryboardよりはわかりやすく楽かもしれません。

「StoryBoard使わない」「xib」「画面遷移」などを組み合わせて検索すると色々出てくるのでご参考までに。
StoryBoardを使わないでプロジェクト作成(Xcode8,Swift3)
極力StoryBoardを使わないXcodeによるSwiftでのiOS開発 2

サンプルコードなどを書かないとわかりにくいかなとも思いましたが少々時間がかかってしまいそうかなと思ったのでわからない部分があればその部分をまた質問して頂ければと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/26 20:39

    丁寧な回答ありがとうございます。とても助かります。
    なんとなくこのまま問題数を増やすならstoryboardじゃ無理なのではないかと思い始めていたのですが、ご回答をみてやはりそうなのだなと確信しました。
    storyboardを用いた初心者向けの書籍を二冊ほど勉強しただけなのですが、storyboardに期待しすぎていたようです。
    一応他の言語の知識も少しだけですがあるので、viewControllerも一つにして配列にして乱数で条件を作ってビューにするというので、なんとなくですが想像はできました。
    ただ前提として補足なのですが、将棋の盤面のような画像と言いましたが、盤面の画像が一つだけあるというよりも、盤面の画像とそれぞれの駒の画像が独立して一つづつあり、多数の画像を合わせて一つの問題画像にしているというイメージです。なので、独立した画像がたくさんあります。また、表示する場所(例えばどの駒がどの位置にあるか)についても3パターンほどあります。その3パターンで駒の配置を表していて、問題によって同じ配置でも駒の種類(画像の種類)が変わるという感じです。
    また、二択のボタン以外にも、正解か不正解かを表すラベル(二択のどちらか押下時に対応した方を表示)とその問題の解説(正解ラベルと同じタイミングで表示)のtextareaが存在します。

    なので、テンプレート的に考えるとラベル等の部品を含めて、画像配置のパターンは3パターンほどあります。これであればviewControllerはそのパターン数あれば良いということになるでしょうか?

    キャンセル

  • 2018/07/27 11:53

    あくまでいただいている中の情報で私が作ろうとした際にどのような作りにするかと言う話だと
    ViewControllerはひとつ、もしくはふたつにすると思います。
    問題を表示するViewControllerと、解答を表示するViewController。
    ふたつはレイアウトとしてはさほど変わらなさそうなのでひとつでも良いかなと思いました。

    中身のViewの構成としては問題画像部分(画面中央配置で上のイメージ、動的に作りたいとのことなのでこれはカスタムビューするのが良さそう)とその他、ラベルやボタン、問題解説も配置してしまう。

    最初は正解ラベルと解説はhidden=trueにしておいて、2択ボタンが押されたときにhidden=falseにするって感じでやれば問題と解答のViewControllerは分けなくても良いかなと思います(機能的に違うんだから分けた方が良いとか、作り的に分けた方が良さそうってケースも考えられます)

    あくまで問題部分の中での配置パターンがと言う意味であればカスタムビューで動的に構成できるようなものを作ればViewControllerを増やす必要はありません。
    カスタムビューの作り方に関しては別途いろいろありますので参考記事をひとつだけ。コードでaddSubViewしていますが、storyboardやxibにViewを貼り付けてクラスを指定するようなやり方でもできます。
    https://qiita.com/sachiko-kame/items/ed81817a83e174e16bea

    極端な話ViewControllerはひとつでも中のViewだけを入れ替えて作るような作り方もできます。
    ただ、そうするとひとつのViewControllerに全ての画面、機能が集まってしまうため、わかりにくい
    、作り方としては好ましくないので、画面、機能ごとにViewControllerを分けるべきであると考えます。

    具体的なやり方がわかりにくい、イメージがつきにくい部分もあると思いますので何かあればまたコメントや質問あげてください。

    キャンセル

  • 2018/07/28 20:48

    追加回答ありがとうございます。現状ストーリーボードでやった部分では問題と回答はhiddenで表示を制御するやり方だったので、とりあえずはそうしてみようかなと思います。
    現状私にとっての課題となりそうな部分は(そもそもstorybourdを使わないということで言えばやったことがないので全ての範囲ですが)問題部分のカスタムビューというものだと思います。
    どうにも学習しないといけない部分が大幅に増えてきたので、いただいたページなど含めもう少し学習してさらに問題点が明確に浮き彫りになれば再質問しようと思います。
    この度は丁寧な回答本当にありがとうございました。とても助かりました。

    キャンセル

-1

「swift 乱数」でぐぐるとしあわせになれます

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/25 21:39

    回答ありがとうございます。
    乱数で条件分岐するとsegueがかなり多くなる気がするのですが、そうするしかないのでしょうか。
    例えばスタート押下時に10問からランダムに1問の画面に遷移し、次は残りの9問から一画面に遷移し、、、という流れでしょうか

    キャンセル

  • 2018/07/25 21:43

    それはあなたがどうしたいか、によります
    重複を無くするのなら、画面数分のフラグを設けて、既表示の画面をマークして選ばれないようにするテですね

    キャンセル

  • 2018/07/25 21:45

    10画面あるなら、開始時に10画面全部の順番を決めてしまえばいいだけのはなしですね

    キャンセル

  • 2018/07/25 22:00

    なるほど、最初に全ての順番を決めると良いですね。
    ありがとうございます。

    キャンセル

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

  • Swift

    7644questions

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

  • Xcode

    4317questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。