前提
私はXcodeをいじり始めて2ヶ月ばかりの初心者です。書籍やネット上の情報を参照しながら制作を進めております。
実現したいこと
約1000問収録のクイズアプリを作成中です。その中に、png形式の画像を利用した問題の章を含めるつもりでおります。
発生している問題・エラーメッセージ
Assets.xcassetsに該当のpng画像をセットし、その画像のタイトルをcsvファイルの0番目に入力しました。それでcsvファイルから該当の画像データを表示させられるかと思ったのですが、以下「問題点1・2・3」のように上手くいきません。
該当のソースコード
Swift
1import UIKit 2 3class ZuzouViewController: UIViewController { 4 @IBOutlet weak var zuzouNumberLabel: UILabel! 5 //↓ここでzuzouImageViewの変数を宣言し、StoryBoardのUIImageViewとも紐付けしてあります 6 @IBOutlet weak var zuzouImageView: UIImageView! 7 @IBOutlet weak var zuzouButton1: UIButton! 8 @IBOutlet weak var zuzouButton2: UIButton! 9 @IBOutlet weak var zuzouButton3: UIButton! 10 @IBOutlet weak var zuzouButton4: UIButton! 11 @IBOutlet weak var judgeImageView: UIImageView! 12 13 var csvArray: [String] = [] 14 var zuzouArray: [String] = [] 15 var zuzouCount = 0 16 var correctCount = 0 17 var selectZuzou = 0 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 22 csvArray = loadCSV(fileName: "Zuzou\(selectZuzou)") 23 24 zuzouArray = csvArray[zuzouCount].components(separatedBy: ",") 25 26 zuzouNumberLabel.text = "図像地図\(selectZuzou):第\(zuzouCount + 1)問" 27 let Path = Bundle.main.path(forResource: zuzouArray[0]as AnyObject as? String, ofType: nil) 28 //(問題点1)↓ここで「定数のzuzouImageViewは存在しない」といった趣旨の黄色メッセージが出ることがあります。letをvarに変えると、「letにしろ」と言われます。 29 let zuzouImageView: UIImage = UIImage(contentsOfFile: Path!)! 30 31 //(問題点2)↓ここでzuzouImageViewについて、Value of type 'UIImage' has no member 'image'というエラーが出ます 32 zuzouImageView.image = (zuzouArray[0]) 33 zuzouButton1.titleLabel?.numberOfLines = 0 34 zuzouButton1.setTitle(zuzouArray[2], for: .normal) 35 zuzouButton2.titleLabel?.numberOfLines = 0 36 zuzouButton2.setTitle(zuzouArray[3], for: .normal) 37 zuzouButton3.titleLabel?.numberOfLines = 0 38 zuzouButton3.setTitle(zuzouArray[4], for: .normal) 39 zuzouButton4.titleLabel?.numberOfLines = 0 40 zuzouButton4.setTitle(zuzouArray[5], for: .normal) 41 // Do any additional setup after loading the view. 42 } 43 44 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 45 let ZuzouResultVC = segue.destination as! ZuzouResultViewController 46 ZuzouResultVC.correct = correctCount 47 ZuzouResultVC.zuzouNumber = selectZuzou 48 } 49 50 @IBAction func btnAction(sender:UIButton) { 51 if sender.tag == Int(zuzouArray[1]) { 52 print("正解") 53 correctCount += 1 54 judgeImageView.image = UIImage(named: "correct") 55 } else { 56 print("不正解") 57 judgeImageView.image = UIImage(named: "incorrect") 58 } 59 print("スコア:\(correctCount)") 60 judgeImageView.isHidden = false 61 zuzouButton1.isEnabled = false 62 zuzouButton2.isEnabled = false 63 zuzouButton3.isEnabled = false 64 zuzouButton4.isEnabled = false 65 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 66 self.judgeImageView.isHidden = true 67 self.zuzouButton1.isEnabled = true 68 self.zuzouButton2.isEnabled = true 69 self.zuzouButton3.isEnabled = true 70 self.zuzouButton4.isEnabled = true 71 self.nextZuzou() 72 } 73 74 } 75 76 func nextZuzou() { 77 zuzouCount += 1 78 if zuzouCount < csvArray.count { 79 zuzouArray = csvArray[zuzouCount].components(separatedBy: ",") 80 zuzouNumberLabel.text = "図像地図\(selectZuzou):第\(zuzouCount + 1)問" 81 //(問題点3)↓ここでCannot assign value of type 'String' to type 'UIImage?'というエラーメッセージが出ます。おそらく型のことを言っていて、画像表示はString型じゃないよと言われているのだと思いますが、どういう型変換をすれば良いのかわかりません。また問題点1・2と違い、個々のzuzouImageViewは、予測変換で出てきて色も黒色ではなく緑色になります。 82 zuzouImageView.image = zuzouArray[0] 83 zuzouButton1.setTitle(zuzouArray[2], for: .normal) 84 zuzouButton2.setTitle(zuzouArray[3], for: .normal) 85 zuzouButton3.setTitle(zuzouArray[4], for: .normal) 86 zuzouButton4.setTitle(zuzouArray[5], for: .normal) 87 88 } else { 89 performSegue(withIdentifier: "toZuzouResultVC", sender: nil) 90 } 91 } 92 93 func loadCSV(fileName: String) -> [String] { 94 let csvBundle = Bundle.main.path(forResource: fileName, ofType: "csv")! 95 do { 96 let csvData = try String(contentsOfFile: csvBundle, encoding: String.Encoding.utf8) 97 let lineChange = csvData.replacingOccurrences(of: "\r", with: "\n") 98 csvArray = lineChange.components(separatedBy: "\n") 99 csvArray.removeLast() 100 } catch { 101 print("エラー") 102 } 103 return csvArray 104 }``` 105 106### 試したこと 107 108何をどう試せばよいのかわからず、こちらのサイトに登録し、お伺いさせていただきました。よろしくお願いします。画像の表示はStringではなく何型だったか調べてはみたのですが、それすらわかりませんでした。 109 110### 補足情報(FW/ツールのバージョンなど) 111 112Xcode13.3です。
投稿した瞬間にタイトルが打ちかけだったことに気がつきました。正しくは「csvファイルから画像を表示させる方法について行き詰まっています」です。今更ですが申し訳ございませんでした。
さらに、これを書いた瞬間に、後から編集可能であったことが判明し、修正いたしました。
たぶん UIImage(named:) を使えば良いと思いますが、ちなみに csv の中身はどんな感じですか?
ありがとうございます。csvの中身は
兵馬俑.png,1,選択肢1,選択肢2,選択肢3,選択肢4
という感じです。
なるほど。まず、日本語ファイル名は問題を起こす可能性があるので、できれば英数字にするのが好ましいですね。
そして、Assets.xcassets を使うなら拡張子は不要です。Image(named: "兵馬俑" ) というか、Image(named: zuzouArray[0]) でアクセスできるはず。
ありがとうございます。最初はbingmayong.pngだったのですが、上手くいかないので兵馬俑.pngに変更していました。また元に戻した上で、Assets.xcassetsから明日やってみて、結果をご報告させて頂きます。
csvファイルの兵馬俑.pngをbingmayongに変更し、問題点1と2の周辺を
//(問題点1)↓ここで「定数のzuzouImageViewは存在しない」といった趣旨の黄色メッセージが出ることがあります。letをvarに変えると、「letにしろ」と言われます。
let zuzouImageView: UIImage = UIImage(contentsOfFile: Path!)!
//(問題点2)↓ここでzuzouImageViewについて、Value of type 'UIImage' has no member 'image'というエラーが出ます
zuzouImageView = UIImage(named: zuzouArray[0])
と変更しましたが、やっぱり上手くいきませんlet zuzouImageViewの行が邪魔しているような気もするのですが、これでいいのでしょうかね?
39行目のエラーメッセージでは「36行目のletをvarにしろ」というので、自動fixをすると、今度は36行目にエラーメッセージが出て「何勝手にletをvarに変えてんだよ、戻せよ」みたいなことを言われます。両方に従っていると無限ループが始まります。
zuzouImageView.image = UIImage(named: zuzouArray[0])
でいいはず。
ありがとうございます。
zuzouImageView = UIImage(named: zuzouArray[0])
にして、「問題点1」のところを削除したら上手く行きました。
おまけに、兵馬俑のスペルまで間違っていたことに気がつきました。
ところで、この質問はどうやって解決済みにすればよいのでしょうか?
あなたの回答
tips
プレビュー