SwiftでiOS開発:ToDoリスト

LINEで送る
Pocket

RSSリーダーでSingle Viewとデータ通信を扱ってみました。
今度は画面遷移をともなうToDoリストを作ってみます。

メイン画面

メイン画面

入力画面

入力画面

XcodeのMaster-Detail Applicationテンプレートを使えば、画面遷移とナビゲーションのあるサンプルが自動的にできあがるので、それを少しだけ改造すればいいです。

ToDoリストアプリについてはObjective−Cで作成したサンプルがあったので、Swiftに書き直してみました。
[iOS]StoryboardでTODOリストアプリを作ろう(1/3) 準備編 MasterDetailApplicationとUITableViewについて
[iOS]StoryboardでTODOリストアプリを作ろう(2/3) TODO項目の入力画面とカスタムクラスの作成編
[iOS]StoryboardでTODOリストアプリを作ろう(3/3) 仕上げ編 Delegateパターンについて

Storyboardの操作は「準備編」と「TODO項目の入力画面とカスタムクラスの作成編」の通りにやればできてしまいます。
あえて違う点をあげるとしたら、メイン画面から入力画面への画面遷移にmodalセグエを使用していますが、これはdepricateになっているので、Present Modallyセグエを使用します。

GitHub

https://github.com/mizumotok/ToDo-Swift

Code

import UIKit

class AddItemViewController : UITableViewController {
    
    @IBAction func clickedSaveButton(sender: AnyObject) {
        println("clickedSaveButton")
        self.delegate?.addItemViewControllerDidFinish(self, item:self.textLabel.text)
    }
    
    @IBAction func clickedCancelButton(sender: AnyObject) {
        println("clickedcancelButton")
        self.delegate?.addItemViewControllerDidCancel(self)
    }
    
    @IBOutlet weak var textLabel: UITextField!
    
    var delegate: AddItemViewControllerDelegate!
}

protocol AddItemViewControllerDelegate {
    func addItemViewControllerDidCancel(controller: AddItemViewController) -> ()
    func addItemViewControllerDidFinish(controller:AddItemViewController, item: String) -> ()
}
import UIKit

class MasterViewController: UITableViewController, AddItemViewControllerDelegate {

    var objects = NSMutableArray()

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.navigationItem.leftBarButtonItem = self.editButtonItem()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func addItemViewControllerDidCancel(controller: AddItemViewController) -> Void {
        println("addItemViewControllerDidCancel")
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    func addItemViewControllerDidFinish(controller: AddItemViewController, item: String) -> Void {
        println("addItemViewControllerDidFinish item: \(item)")
        objects.insertObject(item, atIndex: 0)
        let indexPath : NSIndexPath = NSIndexPath(forRow: 0, inSection: 0)
        self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
        dismissViewControllerAnimated(true, completion: nil)
    }

    // MARK: - Segues

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ShowAddItemView" {
            let addItemViewController : AddItemViewController? = segue.destinationViewController.viewControllers?[0] as AddItemViewController?
            addItemViewController!.delegate = self;
        }
    }

    // MARK: - Table View

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

        let object = objects[indexPath.row] as String
        cell.textLabel?.text = object
        return cell
    }

    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return false if you do not want the specified item to be editable.
        return true
    }

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            objects.removeObjectAtIndex(indexPath.row)
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        } else if editingStyle == .Insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
        }
    }


}
LINEで送る
Pocket

Tags:,

コメントを残す