本に書いてある方法が自分のやりたいことに大体合っているので、そのコードをお借りしたのですが、どうしてもエラーがでて前に進みません。エラーは
fatal error: unexpectedly found nil while unwrapping an Optional value>です。
なお、本はSwift3ではないのですが、Swift3に修正したコードをダウンロードして試すと正常に動作します。さらに、本の不要な部分はコードをCommentOutしても正常に動作するので、導入の仕方は間違っていないと思います。
ストーリーボードで設定したラベル、テキストフィールド、ボタンはいずれもコードと結びついています。
よろしくご指導ください。
第1画面のコードは下記のとおりでアプリを起動するとcsvファイルの通り表示されます。
// ViewController.swift // Mondai01 // // import UIKit class ViewController: UIViewController { @IBOutlet weak var logoImageView: UIImageView! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var bodyTextView: UITextView! @IBOutlet weak var startButton: UIButton! override func viewDidLoad() { super.viewDidLoad() //CSVファイル名を引数にしてloadCSVメソッドを使用し、CSVファイルを読み込む let csvArray = loadCSV("Start") //logoImageViewに画像を設定 logoImageView.image = UIImage(named: csvArray[0]) //titleLabelにアプリ名を設定 titleLabel.text = csvArray[1] //bodyTextViewにアプリ説明文を設定 bodyTextView.text = csvArray[2] //ボタンの文字を白色に変更 startButton.setTitleColor(UIColor.red, for: .normal) //creditLabelにクレジットを設定 } //CSVファイル読み込みメソッド。引数でファイル名を取得。戻り値はString型の配列。 func loadCSV(_ fileName :String) -> [String]{ //CSVファイルのデータを格納するStrig型配列 var csvArray:[String] = [] //引数filnameからCSVファイルのパスを設定 let csvBundle = Bundle.main.path(forResource: fileName, ofType: "csv")! do { //csvBundleからファイルを読み込み、エンコーディングしてcsvDataに格納 let csvData = try String(contentsOfFile: csvBundle,encoding: String.Encoding.utf8) //改行コードが"\r"の場合は"\n"に置換する let lineChange = csvData.replacingOccurrences(of: "\r", with: "\n") //"\n"の改行コードで要素を切り分け、配列csvArrayに格納する csvArray = lineChange.components(separatedBy: "\n") }catch{ print("エラー") } return csvArray //戻り値の配列csvArray } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
第2画面は次のコードです。
// MondaiViewController.swift // Mondai01 // // import UIKit class MondaiViewController: UIViewController{ @IBOutlet weak var mondaiNumberLabel: UILabel! @IBOutlet weak var mondaiTextView: UITextView! @IBOutlet weak var kaitouTextView: UITextView! //kentei.csvファイルを格納する配列csvArray var csvArray:[String] = [] //csvArrayから取り出した問題を格納する配列mondaiArray var mondaiArray:[String] = [] var mondaiCount = 0 //問題をカウントする変数 var correctCount = 0 //正解をカウントする変数 let total = 10 //出題数を管理する変数 override func viewDidLoad() { super.viewDidLoad() let viewController = ViewController() //loadCSVメソッドを使用し、csvArrayに検定問題を格納 csvArray = viewController.loadCSV("OnseiTextCSV") //シャッフルメソッドを使用し、検定問題を並び替えてcsvArrayに格納 //csvArray = mondaiShuffle() //csvArrayの0行目を取り出し、カンマを区切りとしてmondaiArrayに格納 mondaiArray = csvArray[mondaiCount].components(separatedBy: ",") //変数mondaiCountに1を足して、ラベルに出題数を設定 mondaiNumberLabel.text = "第\(mondaiCount+1)問" //TextViewに問題を設定 mondaiTextView.text = mondaiArray[0] //選択肢ボタンのタイトルに選択肢を設定 } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
ビルドはできます。
エラーは正常に表示されている第1画面のスタートボタンを押すと発生します。そして上記のViewController.swiftでエラーマークがでます。そのエラースクリーンショットは次の画像の通りです。
csv fileはXcode上で2つ作成しました。
Start.csv
top_image.png
「スマホの勉強」クイズを始めます
スタートボタンに触ると・・・。終わったら下の完了ボタンを押してください。
OnseiTextCSV.csv
勉強を始めましょう,
初めての漢字変換はできましたか,
音声認識はどんな感じでしたか,
このアプリには用語の解説も載っています,
タブレットには電話機能はついていません,
アイコンとはアプリを現すボタンのことです,
ホームボタンとは画面の下にあるボタンです,
パスワードとは鍵と考えて大切に保管しましょう,
ログインとは登録画面に入ることです,
ご参考事項
開発環境は下記のとおりです。
MacBookPro
OS-X10.12.4 Sierra
Xcode 8.3.2 (8E2002)
参照した本は 世界一受けたい iPhoneアプリ開発の授業 Chapter7-2
四択検定アプリを作ろう
私がやりたいことは
スタートボタンを押したら
第1問
質問 XXXXXXXX
と第2画面に質問が表示される。
これが今回の質問です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/25 15:17
2017/06/25 15:18
2017/06/25 15:35
2017/06/29 20:43