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

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

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

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

Swift

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

Q&A

解決済

2回答

2216閲覧

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

sifa

総合スコア11

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/07/25 12:21

前提・実現したいこと

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

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

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

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

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

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

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

環境はswift4,Xcode9です

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

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

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

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

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

guest

回答2

0

ベストアンサー

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/25 13:38

razuma

総合スコア1313

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

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

sifa

2018/07/26 11:39

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

2018/07/27 02: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を分けるべきであると考えます。 具体的なやり方がわかりにくい、イメージがつきにくい部分もあると思いますので何かあればまたコメントや質問あげてください。
sifa

2018/07/28 11:48

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

0

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

投稿2018/07/25 12:27

y_waiwai

総合スコア87747

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

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

sifa

2018/07/25 12:39

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

2018/07/25 12:43

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

2018/07/25 12:45

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

2018/07/25 13:00

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問