yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

swiftでiOS app

2017-05-27

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