学了这么久的swift语法和相关技术,今天忍不住手痒痒就写了一个swift的小项目,这个项目非常简单(只是使用一个UITableView),但是里面的功能却非常有用。
我们要实现的功能是这样的:
程序启动之后就会出现主界面,在主界面有一些默认的度假地
点击编辑就会出现能过编辑的界面(这里编辑只实现了删除,修改没有处理,增加在+实现了),也可以手指向左拖动实现,
点击+可新增一个项目行
是不是很简单?
下面就看看代码时证明实现的
一;定义一个类用来处理对应的属性
import Foundation class Vocation { var place = "" var visited = false }
二:在主界面嘞中实现下面代码
import UIKit class ListTableViewController: UITableViewController { //度假地数组 var vocationList = [Vocation]() //添加度假地 func loadInitListData() { /** 类的初始化,初始化五个度假地,设置度假地的地名,并且添加到列表中 */ let vocation1 = Vocation() vocation1.place = "北京" vocationList.append(vocation1) let vocation2 = Vocation() vocation2.place = "上海" vocationList.append(vocation2) let vocation3 = Vocation() vocation3.place = "深圳" vocationList.append(vocation3) let vocation4 = Vocation() vocation4.place = "广州" vocationList.append(vocation4) let vocation5 = Vocation() vocation5.place = "南京" vocationList.append(vocation5) } override func viewDidLoad() { super.viewDidLoad() //导航栏左边的按钮 self.navigationItem.leftBarButtonItem = self.editButtonItem() //初始化 loadInitListData() } override func setEditing(editing: Bool, animated: Bool) { super.setEditing(editing, animated: true) //设置表格可以编辑 tableView.setEditing(editing, animated: true) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func numberOfSectionsInTableView(tableView: UITableView) -> Int { //返回一节数据 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //返回数组中数据的数量 return vocationList.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { //重用机制,我们需要在单元格中设置对应的Identifier let cell = tableView.dequeueReusableCellWithIdentifier("ListID", forIndexPath: indexPath) as! UITableViewCell //保存状态 let v = vocationList[indexPath.row] //根据数组的索引出来的地点来填充数据到对应的行 cell.textLabel?.text = v.place //判断单元格的状态 if v.visited { //如果已经参观过则点击一下现实一个勾 cell.accessoryType = UITableViewCellAccessoryType.Checkmark }else { //如果没有去过可以取消点击,去掉那个勾 cell.accessoryType = UITableViewCellAccessoryType.None /**UITableViewCellAccessoryType对应的属性,这里是一个枚举(enmu:case) case None // don't show any accessory view case DisclosureIndicator // regular chevron. doesn't track case DetailDisclosureButton // info button w/ chevron. tracks case Checkmark // checkmark. doesn't track @availability(iOS, introduced=7.0) case DetailButton // info button. tracks */ } return cell } //选择行 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //取出选择的对应行数据 let v1 = vocationList[indexPath.row] //设置已经去过的地方,这里使用取反实现 v1.visited = !v1.visited //取消选中状态 tableView.deselectRowAtIndexPath(indexPath, animated: false) //刷新表格 tableView.reloadData() } // 是否能够编辑 override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { return true } override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { //如果是删除状态 if editingStyle == .Delete { //省略了UITableViewCellEditingStyle //根据索引行删除数据 vocationList.removeAtIndex(indexPath.row) //根据索引行删除单元格 tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) /**UITableViewRowAnimation对应的属性,这里是一个枚举 case Fade case Right // slide in from right (or out to right) case Left case Top case Bottom case None // available in iOS 3.0 case Middle // available in iOS 3.2. attempts to keep cell centered in the space it will/did occupy case Automatic // available in iOS 5.0. chooses an appropriate animation style for you */ //如果是插入状态 } else if editingStyle == .Insert { } } // Override to support rearranging the table view. override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { } //是否能够移动 override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { return true } //prepareForSegue方法 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { } //回到主界面的方法 @IBAction func unwindToList(segue: UIStoryboardSegue){ //定义一个源控制器为我们自定义的控制器 let source = segue.sourceViewController as! AddViewController let va = source.vocation //判断度假地是否为空 if va.place != "" { vocationList.append(va) } } }
实现点击新增(+)界面的代码
class AddViewController: UIViewController { //初始化类 var vocation = Vocation() @IBOutlet weak var text: UITextField! //@IBOutlet weak var textField:UItextField! @IBOutlet weak var done: UIBarButtonItem! //@IBOutlet weak var doneBtn:UIBarButtonItem! override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if sender as! NSObject == done { if (!text.text.isEmpty) { vocation.place = text.text } } }