前提・実現したいこと
ここに質問の内容を詳しく書いてください。
Swiftを今月から始めた初学者です。
tableviewのsectionの機能について詳しい方いましたらご指導願います。
現在、Swift5 csvを利用したtablviewのページを作っており、indexPath.rowをキーとして、csvの問題を読み込んでいます。
indexPath.rowの値はsectionが変わるごとに1になってしまい,セクションごとにきれいに並べることができません。
該当のソースコード
// // IndexViewController.swift import UIKit class IndexViewController: UIViewController,UITableViewDelegate,UITableViewDataSource{ //スクリーンの横幅、縦幅を定義 let screenWidth = Int(UIScreen.main.bounds.size.width) let screenHeight = Int(UIScreen.main.bounds.size.height) //テーブルビューインスタンス作成 var sampleTableView: UITableView = UITableView.init(frame: CGRect.zero, style: .grouped) //配列用 var csvArray: [String] = [] var quizArray: [String] = [] var quizCount = 0 // Sectionで使用する配列を定義する. private let sections: Array = ["セクション0", "セクション1", "セクション2"] //ここから override func viewDidLoad() { super.viewDidLoad() //テーブルビューの設置場所を指定 sampleTableView.frame = CGRect(x:screenWidth * 0/100, y:screenHeight * 10/100, width:screenWidth * 100/100, height:screenHeight * 80/100) // sampleTableView の dataSource 問い合わせ先を self に sampleTableView.delegate = self // sampleTableView の delegate 問い合わせ先を self に sampleTableView.dataSource = self //cellに名前を付ける sampleTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") //実際にviewにsampleTableViewを表示させる self.view.addSubview(sampleTableView) //cellの高さを指定 self.sampleTableView.rowHeight = 50 //sectionの高さを指定 self.sampleTableView.sectionHeaderHeight = 20 //セパレーターの色を指定 let bgColor = UIColor.darkGray.withAlphaComponent(0.1) // ←好きな色を生成 self.sampleTableView.backgroundColor = bgColor self.sampleTableView.backgroundView?.backgroundColor = bgColor sampleTableView.separatorColor = UIColor.blue csvArray = loadCSV(fileName: "quiz") print(csvArray) } //セクション数を指定 func numberOfSections(in sampleTableView: UITableView) -> Int { return sections.count } // セクションのタイトルを返す func tableView(_ sampleTableView: UITableView, titleForHeaderInSection section: Int) -> String? { return sections[section] } //表示するcellの数を指定 func tableView(_ sampleTableView: UITableView, numberOfRowsInSection section: Int) -> Int { if section == 0 { return 0 } else if section == 1 { return 4 } else { return 2 } } //cellのコンテンツ func tableView(_ sampleTableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "cell") //cellにはsampleArrayが一つずつ入るようにするよ! quizArray = csvArray[indexPath.row].components(separatedBy: ",") cell.textLabel?.text = quizArray[1] cell.detailTextLabel?.text = "前回: (quizArray[2])" cell.detailTextLabel?.textColor = UIColor.blue print(indexPath.section) //分けない限り0固定 return cell } //cellが選択された時の処理 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("(indexPath.row)番セルが押されたよ!") let vc = QuizViewController() vc.englishQuizzes = fetchQuizzes() vc.index = indexPath.row let nav = UINavigationController(rootViewController: vc) //フルスクリーンで実施 nav.modalPresentationStyle = .fullScreen present(nav, animated: true, completion: nil) } private func fetchQuizzes() -> [Quiz] { let quizs: [Quiz] = loadCSV(fileName: "quiz").map { let quiz = $0.components(separatedBy: ",") let choice = quiz.suffix(from: 3) .enumerated().map { "\n($0.offset + 1) ($0.element)" }.joined(separator: "\n") let question = "(quiz[1])\n\n(choice)" let Exp = "(quiz[0])" return Quiz(question: question,Exp: Exp, answerCount: 5, answer: Int(quiz[2])!) } return quizs } func loadCSV(fileName: String) -> [String] { let csvBundle = Bundle.main.path(forResource: fileName, ofType: "csv")! do { let csvData = try String(contentsOfFile: csvBundle,encoding: String.Encoding.utf8) let lineChange = csvData.replacingOccurrences(of: "\r", with: "\n") csvArray = lineChange.components(separatedBy: "\n").filter { !$0.isEmpty } } catch let error as NSError { print(error.localizedDescription) } return csvArray } //end } ************************************** // // Quiz.swift struct Quiz { let question: String let Exp: String let answerCount: Int let answer: Int } class QuizFixture { static func test( question: String = "test", Exp: String = "解答がはいるよ", answerCount: Int = 4, answer: Int = 2 ) -> Quiz { return Quiz(question: question,Exp: Exp, answerCount: answerCount, answer: answer) } } ************************************** // // quiz.csv a,1,1,1,1,1 b,2,2,2,2,2 c,3,3,3,3,3 d,4,4,4,4,4 e,5,5,5,5,5 f,6,6,6,6,6 g,7,7,7,7,7 h,8,8,8,8,8 i,9,9,9,9,9
試したこと
tableviewにした際に下のように可変にセクションを区切りたい。
section0
a
a
c
section1
d
e
f
g
section2
h
i
補足情報(ツールのバージョン:Xcode Version 11.4.1 (11E503a))
quiz.csv にセクションを区切るための情報が必要なのでは。
csvArrayで改行ごと、,quizArrayで列ごとに区切っています。
次のfuncで改行ごとにCSVのデータを区切っています。
→func loadCSV(fileName: String) -> [String] {
let csvBundle = Bundle.main.path(forResource: fileName, ofType: "csv")!
do {
let csvData = try String(contentsOfFile: csvBundle,encoding: String.Encoding.utf8)
let lineChange = csvData.replacingOccurrences(of: "\r", with: "\n")
csvArray = lineChange.components(separatedBy: "\n").filter { !$0.isEmpty }
} catch let error as NSError {
print(error.localizedDescription)
}
return csvArray
}
また、次のfuncで列ごと","でCSVのデータを区切っています。
//cellのコンテンツ
func tableView(_ sampleTableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "cell")
//cellにはsampleArrayが一つずつ入るようにするよ!
→ quizArray = csvArray[indexPath.row].components(separatedBy: ",")
cell.textLabel?.text = quizArray[1]
cell.detailTextLabel?.text = "前回: \(quizArray[2])"
cell.detailTextLabel?.textColor = UIColor.blue
print(indexPath.section) //分けない限り0固定
return cell
}
これにもう一つ変数をsectionArrayなるものを追加して、quizArray[1]を入れていきましたが、うまくいかず・・・・です。
それは分かりますが、csv の内容が
a,1,1,1,1,1
b,2,2,2,2,2
c,3,3,3,3,3
d,4,4,4,4,4
e,5,5,5,5,5
f,6,6,6,6,6
g,7,7,7,7,7
h,8,8,8,8,8
i,9,9,9,9,9
として、section 0 は a 〜 c、section 1 は d 〜 g、section 2 は h 〜 i だと判断するための情報が足りないってことです。
例えば各行の先頭に、
0,a,1,1,1,1,1
0,b,2,2,2,2,2
0,c,3,3,3,3,3
1,d,4,4,4,4,4
...
のように section 番号を入れるとかしないと区別できないのでは。(これはあくまでも一つの例で、やり方は他にもいろいろ考えられますが。)
回答1件
あなたの回答
tips
プレビュー