この記事は3年以上前に書かれた記事で内容が古い可能性があります
swiftでiOS app
swiftでの初めてのiOS app作り。
これとか
iOS(Swift)入門の入門
これの
swiftでcsvを扱う
続き。
csvファイルからリストを表示するように作成したところが前回まで。
今回は、「セクション追加」を実施。
以下のようなcsvファイルから
織田信長,img1,鳴かぬなら,鳴かぬなら殺してしまえホトトギス,sec1 豊臣秀吉,img2,鳴かぬなら,鳴かぬなら鳴かせてみせようホトトギス,sec1 徳川家康,img3,鳴かぬなら,鳴かぬなら鳴くまで待とうホトトギス,sec2 デカルト,img4,我思う,我思うゆえに我あり,sec2 アリストテレス,img5,我々の性格は,我々の性格は我々の行動の結果なり,sec2 プラトン,img6,自分に打ち勝つことが,自分に打ち勝つことが最も偉大な勝利なり,sec3
入れ子を駆使したリストを作成して
(力わざ)
[[["", "", "", "", "sec1"], ["織田信長", "img1", "鳴かぬなら", "鳴かぬなら殺してしまえホトトギス", "sec1"], ["豊臣秀吉", "img2", "鳴かぬなら", "鳴かぬなら鳴かせてみせようホトトギス", "sec1"]], [["", "", "", "", "sec2"], ["徳川家康", "img3", "鳴かぬなら", "鳴かぬなら鳴くまで待とうホトトギス", "sec2"], ["デカルト", "img4", "我思う", "我思うゆえに我あり", "sec2"], ["アリストテレス", "img5", "我々の性格は", "我々の性格は我々の行動の結果なり", "sec2"]], [["", "", "", "", "sec3"], ["プラトン", "img6", "自分に打ち勝つことが", "自分に打ち勝つことが最も偉大な勝利なり", "sec3"]]]
投影!
クリックするとこんな感じ
うまくいかなかった点
– ループ処理はうまくいかず、ひとまずセクションは10個までとの制約のもとif文を駆使して作成した。
– swiftの変数の扱いがよくわからず、ひとまず空っぽの変数を作っている
とはいえ、なんとか動いているので、Tableview controllerの中身の流れをメモメモ。
■自分で定義した関数
func get_lists() -> (Array<Any>, Array<Any>, Array<Any>){ }
例の入れ子ゴリゴリのリスト、それぞれのセクションの行数、セクション名のリスト、の三つを返してくれる関数を作成。後々使えそうだったので。
section_lists_format [[["", "", "", "", "sec1"], ["織田信長", "img1", "鳴かぬなら", "鳴かぬなら殺してしまえホトトギス", "sec1"], ["豊臣秀吉", "img2", "鳴かぬなら", "鳴かぬなら鳴かせてみせようホトトギス", "sec1"]], [["", "", "", "", "sec2"], ["徳川家康", "img3", "鳴かぬなら", "鳴かぬなら鳴くまで待とうホトトギス", "sec2"], ["デカルト", "img4", "我思う", "我思うゆえに我あり", "sec2"], ["アリストテレス", "img5", "我々の性格は", "我々の性格は我々の行動の結果なり", "sec2"]], [["", "", "", "", "sec3"], ["プラトン", "img6", "自分に打ち勝つことが", "自分に打ち勝つことが最も偉大な勝利なり", "sec3"]]] number_of_rows [2, 3, 1] section_list_array ["sec1", "sec2", "sec3"]
■最初に読まれる関数
override func viewDidLoad() { }
一番最初に読まれる関数、csvファイルの読み込みをここで
// get csv file path let csvPath = Bundle.main.path(forResource: "QuoteList", ofType: "csv") print("csvPath is " + csvPath!) // get csv data let csvData = try? NSString(contentsOfFile: csvPath!, encoding: String.Encoding.utf8.rawValue) // format scv data let dataList = csvData?.components(separatedBy: "\n") //print(dataList ?? "default data") for line in dataList! { let l = line.components(separatedBy: ",") dataListFormat.append(l) }
■セクションの個数を返す関数
override func numberOfSections(in tableView: UITableView) -> Int { }
この中で、セクションの個数をreturnする
■セクションの中の行数を返す関数
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { }
この中で、各セクションの中の行数をreturnする
■セクションの見出しを返す関数
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { }
この中でセクションの見出しをreturnする
■セルの中にデータを入れる関数
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { }
ストーリーボードでぽちぽちレイアウト入れた際に、ラベルのタグ番号を設定したはずなので、そこに入れたいデータを定義していく。
こことか(赤枠)
ここに設定したので(赤枠)
こんな感じで入れていく
let imageView = tableView.viewWithTag(1) as! UIImageView imageView.image = UIImage(named:"\(section_lists_format![0][indexPath.row + 1][1])") let label1 = tableView.viewWithTag(2) as! UILabel label1.text = "\(section_lists_format![0][indexPath.row + 1][0])" let label2 = tableView.viewWithTag(3) as! UILabel label2.text = "\(section_lists_format![0][indexPath.row + 1][2])"
■セクション内の行を選択した時に呼ばれる関数
override func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) { }
セクション内の行を選択した時に動く関数なので、ここで次画面に引き継ぐ変数を定義してみる
■次画面に移る際に呼ばれる関数
override func prepare(for segue : UIStoryboardSegue, sender: Any?){ }
次画面への値の引き継ぎ処理をここで実施する
if segue.identifier == "toTableSubView" { // pass var to SubView let TableSV = segue.destination as! TableSubView TableSV.indexno = self.indexno TableSV.nameSV = self.nameSV TableSV.imgSV = self.imgSV TableSV.labelSV = self.labelSV TableSV.labeldetailSV = self.labeldetailSV }
toTableSubViewはviewcontrollerで定義した値(赤枠)
次の目標は、ループさせるところを諦めず改良することと、swiftの基本文法を勉強すること。
僭越ながらコードはこちら
https://github.com/yoshi-island/swift_work