18.利用UITableView制作一个列表选择器

在很多时候, 我们需要一个表格的选择器, 好让我们找到对应的选项进行选取, 现在让我们一起来看看怎么动手去制作这个选择器吧.


1.界面布局

1

2

3

4

5

6

7

8

9


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.最终效果

0


好了, 这次就讲到这里, 下次我们继续
工程地址: 链接: http://pan.baidu.com/s/1o6nAJOI 密码: 29pd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在iOS中,一个视图只能有一个UITableView。但是可以通过创建多个UITableView来实现一个视图中显示多个表格的效果。以下是一个示例代码: 首先,你需要在视图控制器中添加多个UITableView的实例变量: ```swift class YourViewController: UIViewController { var tableView1: UITableView! var tableView2: UITableView! // ... } ``` 然后,在视图加载完成后,你可以创建和配置这些UITableView的实例: ```swift override func viewDidLoad() { super.viewDidLoad() // 创建第一个UITableView tableView1 = UITableView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/2)) tableView1.dataSource = self tableView1.delegate = self view.addSubview(tableView1) // 创建第二个UITableView tableView2 = UITableView(frame: CGRect(x: 0, y: view.frame.height/2, width: view.frame.width, height: view.frame.height/2)) tableView2.dataSource = self tableView2.delegate = self view.addSubview(tableView2) // ... } ``` 接下来,你需要实现UITableViewDataSource和UITableViewDelegate协议的相关方法来提供表格的数据和处理交互事件。例如: ```swift extension YourViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if tableView == tableView1 { // 返回第一个UITableView的行数 return 10 } else if tableView == tableView2 { // 返回第二个UITableView的行数 return 5 } return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) if tableView == tableView1 { // 配置第一个UITableView的单元格 cell.textLabel?.text = "Table View 1 - Row \(indexPath.row)" } else if tableView == tableView2 { // 配置第二个UITableView的单元格 cell.textLabel?.text = "Table View 2 - Row \(indexPath.row)" } return cell } } extension YourViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if tableView == tableView1 { // 处理第一个UITableView的行选中事件 print("Table View 1 - Row \(indexPath.row) selected") } else if tableView == tableView2 { // 处理第二个UITableView的行选中事件 print("Table View 2 - Row \(indexPath.row) selected") } } } ``` 这样,你就可以在同一个视图中使用多个UITableView了。记得在视图控制器中遵循UITableViewDataSource和UITableViewDelegate协议,并在视图加载完成后设置数据源和代理。 希望这能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值