m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

swiftの学習(xcodeのtodoサンプル(データ保存なし))

概要

  • データは保存しない
  • tableviewを使用
  • navigationは未使用

tableviewの画面を作成

シングルページアプリケーションを作成

f:id:m_shige1979:20141005152150p:plain

datasourceなどを連携

f:id:m_shige1979:20141005152332p:plain

アイテムなどを連結して設定
//
//  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")
    }

}
画面

f:id:m_shige1979:20141005152919p:plain
※データが空だからなにもない



遷移先の画面へ遷移

別途ViewControllerを追加

f:id:m_shige1979:20141005153405p:plain

アイテムを設定

f:id:m_shige1979:20141005153919p:plain

追加画面をviewClassと連結

f:id:m_shige1979:20141005154152p:plain

table、button選択時に画面遷移するように設定

f:id:m_shige1979:20141005154552p:plain

identifierを設定

f:id:m_shige1979:20141005155106p:plain
※セグエを選択して名前を設定

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" {
        }
    }


}

※遷移先から戻るときのメソッドや遷移時のメソッドを予め用意しておく。中身は空

遷移先で戻る場合の遷移を設定

f:id:m_shige1979:20141005155900p:plain

画面

f:id:m_shige1979:20141005160542g:plain



あと少し…
まだ、データの保存処理とかないんですけど…


追加、編集

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.
    }
    
}
結果

f:id:m_shige1979:20141005165712g:plain

所感

このままだとデータが消えるのでデータを内部で保存する処理が必要。
なんかDB系の制御とかいるかもしれないけど、どうやってやるかは不明なのでまた、調査のよう。

このあたりまでいくとRSSリーダーとかのソースみても理解できそうな予感