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


