30 9月 2014
SwiftでiOS開発:ToDoリスト
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. } } }