swiftの学習(xcodeのtodoサンプル(データ保存なし))
概要
- データは保存しない
- tableviewを使用
- navigationは未使用
tableviewの画面を作成
シングルページアプリケーションを作成
datasourceなどを連携
アイテムなどを連結して設定
// // ViewController.swift // import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tbl_viewlist: UITableView! var items = [Dictionary<String, String>]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ // リストの件数を返す return items.count } // セルをitemsから設定する処理 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")! cell.textLabel?.text = items[indexPath.row]["name"]! cell.detailTextLabel?.text = items[indexPath.row]["detail"] return cell; } // セルをクリックした時に発生するイベント func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ println(indexPath.row) } // 追加ボタン押下 @IBAction func btn_pushAdd(sender: AnyObject) { println("add") } }
画面
※データが空だからなにもない
遷移先の画面へ遷移
別途ViewControllerを追加
アイテムを設定
追加画面をviewClassと連結
table、button選択時に画面遷移するように設定
identifierを設定
※セグエを選択して名前を設定
ViewController.swift
// // ViewController.swift // import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tbl_viewlist: UITableView! var items = [Dictionary<String, String>]() var idx = -1 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ // リストの件数を返す return items.count } // セルをitemsから設定する処理 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")! cell.textLabel?.text = items[indexPath.row]["name"]! cell.detailTextLabel?.text = items[indexPath.row]["detail"] return cell; } // セルをクリックした時に発生するイベント func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ idx = indexPath.row performSegueWithIdentifier("page1", sender: self) } // 追加ボタン押下 @IBAction func btn_pushAdd(sender: AnyObject) { idx = -1 performSegueWithIdentifier("page1", sender: self) } // 画面遷移時にセグエにより処理を切り替え override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if segue.identifier == "page1" { } } // 設定ボタン押下時のメソッド @IBAction func unWindows(segue: UIStoryboardSegue){ if segue.identifier == "page2" { } } // 削除ボタン押下時のメソッド @IBAction func unWindowsDelete(segue: UIStoryboardSegue){ if segue.identifier == "page2_2" { } } }
遷移先で戻る場合の遷移を設定
画面
あと少し…
まだ、データの保存処理とかないんですけど…
追加、編集
ViewController.swift
// // ViewController.swift // import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tbl_viewlist: UITableView! var items = [Dictionary<String, String>]() var idx = -1 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ // リストの件数を返す return items.count } // セルをitemsから設定する処理 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")! cell.textLabel?.text = items[indexPath.row]["name"]! cell.detailTextLabel?.text = items[indexPath.row]["detail"] return cell; } // セルをクリックした時に発生するイベント func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ idx = indexPath.row performSegueWithIdentifier("page1", sender: self) } // 追加ボタン押下 @IBAction func btn_pushAdd(sender: AnyObject) { idx = -1 performSegueWithIdentifier("page1", sender: self) } // 画面遷移時にセグエにより処理を切り替え override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if segue.identifier == "page1" { // ViewDetailControllerへ遷移する際、値を渡す let viewDetailController: ViewDetailController = segue.destinationViewController as ViewDetailController viewDetailController._key = idx if idx != -1 { viewDetailController._data1 = items[idx]["name"]! viewDetailController._data2 = items[idx]["detail"]! } } } // 設定ボタン押下時のメソッド @IBAction func unWindows(segue: UIStoryboardSegue){ if segue.identifier == "page2" { // 遷移元のControllerを取得 let viewDetailController: ViewDetailController = segue.sourceViewController as ViewDetailController // 画面にデータを設定 var _k = viewDetailController._key var _d1 = viewDetailController.txt_data1.text var _d2 = viewDetailController.txt_data2.text if _d1 == "" && _d2 == "" { if _k != -1 { items.removeAtIndex(_k) } }else{ if _k == -1 { // 先頭に追加 items.insert([ "name": _d1, "detail": _d2 ], atIndex: 0 ) }else{ // 変更 items[_k]["name"] = _d1 items[_k]["detail"] = _d2 } } // table再読み込み tbl_viewlist.reloadData() } } // 削除ボタン押下時のメソッド @IBAction func unWindowsDelete(segue: UIStoryboardSegue){ if segue.identifier == "page2_2" { // 遷移元のControllerを取得 let viewDetailController: ViewDetailController = segue.sourceViewController as ViewDetailController // 画面にデータを設定 var _k = viewDetailController._key if _k != -1 { // 指定のデータを削除 items.removeAtIndex(_k) } // table再読み込み tbl_viewlist.reloadData() } } }
ViewDetailController.swift
// // ViewDetailController.swift // import UIKit class ViewDetailController: UIViewController { var _key = -1 var _data1 = "" var _data2 = "" @IBOutlet weak var txt_data1: UITextField! @IBOutlet weak var txt_data2: UITextField! @IBOutlet weak var btn_delete: UIButton! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. txt_data1.text = _data1 txt_data2.text = _data2 btn_delete.hidden = true if _key != -1 { btn_delete.hidden = false } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
結果
所感
このままだとデータが消えるのでデータを内部で保存する処理が必要。
なんかDB系の制御とかいるかもしれないけど、どうやってやるかは不明なのでまた、調査のよう。
このあたりまでいくとRSSリーダーとかのソースみても理解できそうな予感