在很多时候, 我们需要一个表格的选择器, 好让我们找到对应的选项进行选取, 现在让我们一起来看看怎么动手去制作这个选择器吧.
1.界面布局
2.开始AddExpenseTableViewController代码
// 1.关联UITableViewCell的Detail属性
@IBOutlet weak var detailLabel: UILabel!
// 2.自定义一个NSDate变量
var defaults = NSUserDefaults.standardUserDefaults()
override func viewDidLoad() {
super.viewDidLoad()
// 3.判断NSData的category是否为nil
if defaults.objectForKey("category") == nil {
// 3.1.是得话, 就设置UITableViewCell的Detail文本为"Eating Out"
detailLabel.text = "Eating Out"
} else {
// 3.2.否则就设置Detail的text为NSData里的category表格里的text
detailLabel.text = defaults.objectForKey("category") as? String
}
}
// 4.自定义IBAction方法
@IBAction func selectedCategory(segue: UIStoryboardSegue) {
// 4.1.获得segue链接的ViewController
let selectedCategoryViewController = segue.sourceViewController as! SelectCategoryTableViewController
// 4.2.判断selectedCategory的内容是否为对应的内容 if
let selectedCategory = selectedCategoryViewController.selectedCategory {
// 4.2.1.如果是, 那么就把selectedCategory赋值到UITableViewCell的Detail
detailLabel.text = selectedCategory
// 4.2.2.并且生成对应的键值对
defaults.setObject(selectedCategory, forKey: "category")
}
}
3.开始SelectCategoryTableViewController代码
// 1.自定义一个字符串数组
var categories = ["Rent", "Grocery", "Eating Out", "Cell Phone", "Internet", "Gas", "Insurance", "Electricity"]
// 2.自定义一个字符串变量
var selectedCategory: String?
// 3.自定义个Int类型变量
var selectedCategoryIndex: Int?
// 4.自定义一个NSDate变量
var defaults = NSUserDefaults.standardUserDefaults()
override func viewDidLoad() {
super.viewDidLoad()
// 5.判断defaults中得index是否等于nil
if defaults.objectForKey("index") == nil {
// 5.1.如果是, 就把2赋值给selectedCategoryIndex
selectedCategoryIndex = 2
} else {
// 5.2.否则就把defaults里的index值赋给selectedCategoryIndex
selectedCategoryIndex = defaults.objectForKey("index") as? Int
}
}
// 6.设置UITabelView的UITableViewCell的组数
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
// 7.设置UITabelView的UITableViewCell的条数
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return categories.count
}
// 8.设置UITableViewCell的数据源
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// 8.1.获取identifier为category的UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("category", forIndexPath: indexPath) as! UITableViewCell
// 8.2.设置UITableViewCell的tetxtLabel的text内容
cell.textLabel?.text = categories[indexPath.row]
// 8.3.判断selectedCategoryIndex是否等于当前的indexPath.row
if selectedCategoryIndex == indexPath.row {
// 8.4.如果是的话, 就把UITableViewCellAccessoryType设置为Checkmark
cell.accessoryType = UITableViewCellAccessoryType.Checkmark } else {
// 8.5.否则的话, 就把UITableViewCellAccessoryType设置为None
cell.accessoryType = UITableViewCellAccessoryType.None
}
// 8.6.最后把设置好的UITableViewCell返回
return cell
}
// 9.重写UITableViewCell的点击代理方法
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// 9.1.判断index是否是selectedCategoryIndex
if let index = selectedCategoryIndex {
// 9.1.1.如果是, 那么就把NSIndexPath赋值给indexPath
let indexPath = NSIndexPath(forRow: index, inSection: 0)
// 9.1.2.并且把设置好的indexPath放到cellForRowAtIndexPath中
let cell = tableView.cellForRowAtIndexPath(indexPath)
// 9.1.3.设置cell的UITableViewCellAccessoryType为None
cell?.accessoryType = UITableViewCellAccessoryType.None
}
// 9.2.设置selectedCategoryIndex为indexPath.row
selectedCategoryIndex = indexPath.row
// 9.3.设置selectedCategory为categories[indexPath.row]
selectedCategory = categories[indexPath.row]
// 9.4.获取当前的UITableViewCell
let cell = tableView.cellForRowAtIndexPath(indexPath)
// 9.5.设置cell的UITableViewCellAccessoryType为Checkmark
cell?.accessoryType = UITableViewCellAccessoryType.Checkmark
}
// 10.重写prepareForSegue方法
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// 10.1.判断segue的identifier是否等于SelectedCategory
if segue.identifier == "SelectedCategory" {
// 10.1.1.如果是, 那么获取到当前的sender赋值给Cell
let cell = sender as! UITableViewCell
// 10.1.2.获取到当前Cell的index
let index = tableView.indexPathForCell(cell)
// 10.1.3.设置selectedCategoryIndex为index.row
selectedCategoryIndex = index?.row
// 10.1.4.判断indexPath是否是index.row
if let indexPath = index?.row {
// 10.1.4.1.如果是, 就把indexPath存入defaults, 并且设置的Key为index
defaults.setInteger(indexPath, forKey: "index")
// 10.1.4.2.设置selectedCategory为categories[indexPath]
selectedCategory = categories[indexPath]
}
}
}
// 11.自定义取消的方法
@IBAction func cancelToCategoryList(segue: UIStoryboardSegue){
}
// 12.自定义保存的方法
@IBAction func saveToCategoryList(segue: UIStoryboardSegue) {
// 12.1.获取segue连接的VIewController
let newCategoryViewController = segue.sourceViewController as! NewCategoryTableViewController
// 12.2.判断newCategoryViewController.newCategoryName是否等于""
if newCategoryViewController.newCategoryName == "" {
} else {
// 12.2.1.如果不是的话, 就把newCategoryViewController.newCategoryName添加进categories
categories.append(newCategoryViewController.newCategoryName!)
// 12.2.2.获取indexPath
let indexPath = NSIndexPath(forRow: categories.count - 1, inSection: 0)
// 12.2.3.往UITableView插入indexPath, 并且设置动画的效果为Automatic
tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
4.开始NewCategoryTableViewController代码
// 1.获取UITextField的属性
@IBOutlet weak var newCategoryTextField: UITextField!
// 2.自定义一个String类型的变量
var newCategoryName: String?
// 3.重写UITableView的点击代理方法
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// 3.1.判断当前所点击的Cell是否为indexPath.section == 0 && indexPath.row == 0
if indexPath.section == 0 && indexPath.row == 0 {
// 3.1.1.如果是, 就把newCategoryTextField设置成第一响应者
newCategoryTextField.becomeFirstResponder()
}
// 3.2.取消UITableViewCell的点击状态
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
// 4.重写prepareForSegue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// 4.1.判断segue的identifier是否为SaveToCategory
if segue.identifier == "SaveToCategory" {
// 4.2.如果是, 那么newCategoryName就等于newCategoryTextField.text
newCategoryName = newCategoryTextField.text
}
}
5.最终效果
好了, 这次就讲到这里, 下次我们继续
工程地址: 链接: http://pan.baidu.com/s/1o6nAJOI 密码: 29pd