资讯专栏INFORMATION COLUMN

iOS开发⑤常见表视图

233jl / 3308人阅读

摘要:分节表视图步骤创建一个工程删除中中的,再从对象库拖入一个到设计界面打开属性检查器,勾选选项,否则应用启动后是黑屏将类的父类由改为打开的属性选择器在列表中选择默认以注册和协议,不需要再注册代码实现年排序组中条目的数量组的数量组的标题

分节表视图 步骤

创建一个iOS工程

删除storyboard中View Controller Scene 中的View Controller,再从对象库拖入一个Table View Controller到设计界面

打开Table View Controller属性检查器,勾选Is Initial View Controller选项,否则应用启动后是黑屏

将ViewController类的父类由UIViewController改为UITableViewController

打开View Controller的属性选择器在Class列表中选择ViewController

UITableViewController默认以注册UITableViewDataSource和UITableViewDelegate协议,不需要再注册

代码实现
//
//  ViewController.swift
//  IndexTable
//
//  Created by Michael on 2016/10/31.
//  Copyright © 2016年 Michael. All rights reserved.
//

import UIKit

class ViewController: UITableViewController {
    
    var datas: NSDictionary!
    
    var groupNames:NSArray!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let path = Bundle.main.path(forResource: "team_dictionary", ofType: "plist")
        
        self.datas = NSDictionary(contentsOfFile: path!)
        
        let tempList = self.datas.allKeys as NSArray
        
        //排序
        let sortedArray = tempList.sortedArray(comparator: { (obj1, obj2) -> ComparisonResult in
            let str1 = obj1 as! String
            let str2 = obj2 as! String
            let ret = str1.compare(str2)
            return ret
        })
        self.groupNames = sortedArray as NSArray!
    }
    


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    //组中条目的数量
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let groupName = self.groupNames[section] as! String
        let teams = self.datas[groupName] as! NSArray
        return teams.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "liu",for: indexPath)
        
        let section = indexPath.section
        
        let row = indexPath.row
        
        let groupName = self.groupNames[section] as! String
        let teams = self.datas[groupName] as! NSArray
        cell.textLabel?.text = teams[row] as? String
        
        return cell
        
    }
    
    //组的数量
    override func numberOfSections(in tableView: UITableView) -> Int {
        return self.groupNames.count
    }
    
    //组的标题
    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        let name = self.groupNames[section] as! String
        return name
    }
    
    //索引的标题
    override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
        var titles = [String]()
        for item in self.groupNames {
            let title = item as! String
            titles.append(title.substring(to: title.index(title.startIndex, offsetBy: 1)))
        }
        return titles
    }

    //点击事件
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let section = indexPath.section
        
        let row = indexPath.row
        
        let groupName = self.groupNames[section] as! String
        let teams = self.datas[groupName] as! NSArray
        print(groupName)
        print(teams[row])
    }

}
示例

静态表视图 步骤

创建一个iOS工程,使用Table View Controller作为表视图控制器

选择Table View,打开属性检查器,从Content下拉列表中选择Static Cells,将Section的值为设为3.,从Style下拉列表中选择Grouped

选择第一个Table View Section,将Rows值设为2,即该节中包含两个单元格,分别拖入一个TextField到两个单元格中

选择第二个Table View Section,将Rows值设为1,拖入一个Button到单元格中

选择第二个Table View Section,将Rows值设为1,拖入一个Lable到单元格中

代码实现
//
//  ViewController.swift
//  StaticTable
//
//  Created by Michael on 2016/11/2.
//  Copyright © 2016年 Michael. All rights reserved.
//

import UIKit

class ViewController: UITableViewController {

    @IBOutlet weak var mUserName: UITextField!
    @IBOutlet weak var mPwd: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func login(_ sender: UIButton) {
        if self.mUserName.text == "liu" && self.mPwd.text == "123" {
            NSLog("login sucess");
            mUserName.resignFirstResponder();
            mPwd.resignFirstResponder();
        }
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        NSLog("Section: %d,Row: %d",indexPath.section,indexPath.row);
    }

}
示例

插入和删除单元格 步骤

创建一个iOS工程

删除storyboard中View Controller Scene 中的View Controller,再从对象库拖入一个Navigation Controller到设计界面,同时也会添加一个Table View Controller到设计界面

打开Table View Controller属性检查器,勾选Is Initial View Controller选项,否则应用启动后是黑屏

将ViewController类的父类由UIViewController改为UITableViewController

打开View Controller的属性选择器在Class列表中选择ViewController

UITableViewController默认以注册UITableViewDataSource和UITableViewDelegate协议,不需要再注册

代码实现
//
//  ViewController.swift
//  DeleteAddCell
//
//  Created by Michael on 2016/11/2.
//  Copyright © 2016年 Michael. All rights reserved.
//

import UIKit

class ViewController: UITableViewController {
    
    var txtField:UITextField!
    
    var listTeams: NSMutableArray!

    override func viewDidLoad() {
        super.viewDidLoad()
        //设置导航栏
        self.navigationItem.rightBarButtonItem = self.editButtonItem
        self.navigationItem.title = "单元格插入和删除"
        
        self.txtField = UITextField()

        
        self.listTeams = NSMutableArray(array: ["黑龙江","吉林","辽宁","北京"])
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //响应视图编辑状态
    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        self.tableView.setEditing(editing, animated: true)
        if editing {
            self.txtField.isHidden = false
        } else{
            self.txtField.isHidden = true
        }
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.listTeams.count + 1
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let isAddCell = (indexPath.row == self.listTeams.count)
        
        let cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath)
        
        if !isAddCell {
            cell.accessoryType = .disclosureIndicator
            cell.textLabel?.text = self.listTeams[indexPath.row] as? String
            
        } else {
            self.txtField.frame = CGRect(x: 40, y: 0, width: 300, height: cell.frame.size.height)
            self.txtField.borderStyle = .none
            self.txtField.placeholder = "Add..."
            self.txtField.text = ""
            cell.addSubview(self.txtField)
        }
        return cell
    }
    
    //返回编辑样式
    override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
        if indexPath.row == self.listTeams.count {
            return .insert
        } else {
            return .delete
        }
    }
    
    //添加删除时调用
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        
        if editingStyle == .delete {
            self.listTeams.removeObject(at: indexPath.row)
            self.tableView.deleteRows(at: [indexPath], with: .fade)
        } else if editingStyle == .insert {
            self.listTeams.insert(self.txtField.text!, at: self.listTeams.count)
            self.tableView.insertRows(at: [indexPath], with: .fade)
        }
        
        self.tableView.reloadData();
    }
    

}
示例

移动单元格 步骤
1. 创建一个iOS工程
2. 删除storyboard中View Controller Scene 中的View Controller,再从对象库拖入一个Navigation Controller到设计界面,同时也会添加一个Table View Controller到设计界面
3. 打开Table View Controller属性检查器,勾选Is Initial View Controller选项,否则应用启动后是黑屏
4. 将ViewController类的父类由UIViewController改为UITableViewController
5. 打开View Controller的属性选择器在Class列表中选择ViewController
6. UITableViewController默认以注册UITableViewDataSource和UITableViewDelegate协议,不需要再注册
代码实现
//
//  ViewController.swift
//  MoveCell
//
//  Created by Michael on 2016/11/2.
//  Copyright © 2016年 Michael. All rights reserved.
//

import UIKit

class ViewController: UITableViewController {
    
    
    var listTeams: NSMutableArray!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //设置导航栏
        self.navigationItem.rightBarButtonItem = self.editButtonItem
        self.navigationItem.title = "单元格移动"
        
        
        
        self.listTeams = NSMutableArray(array: ["黑龙江","吉林","辽宁","北京"])
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    //响应视图编辑状态
    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        self.tableView.setEditing(editing, animated: true)
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.listTeams.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "MoveCell", for: indexPath)
        
            cell.accessoryType = .disclosureIndicator
            cell.textLabel?.text = self.listTeams[indexPath.row] as? String

        return cell
    }
    
    //返回true表示可以移动
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    //移动单元格时触发此方法
    override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        let mode = self.listTeams[sourceIndexPath.row] as! String
        
        self.listTeams.removeObject(at: sourceIndexPath.row)
        self.listTeams.insert(mode, at: destinationIndexPath.row)
    }
    
    //编辑的样式
    override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
            return .delete
    }
    
    
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        
        if editingStyle == .delete {
            self.listTeams.removeObject(at: indexPath.row)
            self.tableView.deleteRows(at: [indexPath], with: .fade)
        } else if editingStyle == .insert {
            self.tableView.insertRows(at: [indexPath], with: .fade)
        }
        
        self.tableView.reloadData();
    }
    
    
}
示例

下拉刷新 步骤

创建一个iOS工程

删除storyboard中View Controller Scene 中的View Controller,再从对象库拖入一个Table View Controller到设计界面

打开Table View Controller属性检查器,勾选Is Initial View Controller选项,否则应用启动后是黑屏

将ViewController类的父类由UIViewController改为UITableViewController

打开View Controller的属性选择器在Class列表中选择ViewController

UITableViewController默认以注册UITableViewDataSource和UITableViewDelegate协议,不需要再注册

代码实现
//
//  ViewController.swift
//  RefreshCell
//
//  Created by Michael on 2016/11/7.
//  Copyright © 2016年 Michael. All rights reserved.
//



import UIKit

class ViewController: UITableViewController {
    
    
    var listTeams: NSMutableArray!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //设置导航栏
        self.navigationItem.rightBarButtonItem = self.editButtonItem
        self.navigationItem.title = "单元格移动"
        
        let rc = UIRefreshControl()
        rc.attributedTitle = NSAttributedString(string: "下拉刷新")
        rc.addTarget(self, action: #selector(ViewController.refresh), for: .valueChanged)
        self.refreshControl = rc
        
        
        self.listTeams = NSMutableArray(array: ["黑龙江","吉林","辽宁","北京"])
    }
    
    func refresh() {
        NSLog("refresh")
        if (self.refreshControl?.isRefreshing)! {
            self.refreshControl?.attributedTitle = NSAttributedString(string: "加载中")
            listTeams.add("上海")
            listTeams.add("天津")
            
            self.refreshControl?.endRefreshing()
            self.refreshControl?.attributedTitle = NSAttributedString(string: "下拉刷新")
        }
        self.tableView.reloadData()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    //响应视图编辑状态
    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        self.tableView.setEditing(editing, animated: true)
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.listTeams.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "RefreshCell", for: indexPath)
        
        cell.accessoryType = .disclosureIndicator
        cell.textLabel?.text = self.listTeams[indexPath.row] as? String
        
        return cell
    }
    
    //返回true表示可以移动
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    //移动单元格时触发此方法
    override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        let mode = self.listTeams[sourceIndexPath.row] as! String
        
        self.listTeams.removeObject(at: sourceIndexPath.row)
        self.listTeams.insert(mode, at: destinationIndexPath.row)
    }
    
    //编辑的样式
    override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
        return .delete
    }
    
    
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        
        if editingStyle == .delete {
            self.listTeams.removeObject(at: indexPath.row)
            self.tableView.deleteRows(at: [indexPath], with: .fade)
        } else if editingStyle == .insert {
            self.tableView.insertRows(at: [indexPath], with: .fade)
        }
        
        self.tableView.reloadData();
    }
    
    
}
示例

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16538.html

相关文章

  • 程序员笔记|全面解析Oracle等待事件的分类、发现及优化

    摘要:较等待事件的方式,更有概括性。在非空闲的等待事件,又可进一步划分细的类别。此等待事件的平均等待用时单位百分之一秒。活动会话正在等待的资源或事件信息。的等待事件结束后,的统计信息将会发生改变。 一、等待事件由来 大家可能有些奇怪,为什么说等待事件,先谈到了指标体系。其实,正是因为指标体系的发展,才导致等待事件的引入。总结一下,Oracle的指标体系,大致经历了下面三个阶段: 以命中率为主...

    娣辩孩 评论0 收藏0
  • iOS开发视图

    摘要:表视图又一下部分组成表头视图表视图最上边的视图表脚视图表视图最下边的视图单元格表视图中每一行的视图节由多个单元格组成,应用于分组列表节头节脚表视图的相关类继承自,且有两个协议和。此外类时单元格类,类时的控制器,用于为节头和节脚提供视图。 概述 表视图组成 表视图是iOS开发中最重要的视图,它以列表的形式展示数据。表视图又一下部分组成: 表头视图:表视图最上边的视图 表脚视图:表视图最...

    bawn 评论0 收藏0
  • Android 和 iOS 孰优孰劣:真实应用开发过程告诉你答案

    摘要:最近我完成了和的开发。通过这次的实践,我希望透过独特的视角,分析和比较为这两个平台开发应用的过程。在上,屏幕翻转会直接销毁现有整个视图栈栈,屏幕翻转完成后再重建每个视图。 随便搜索一下Android vs. iOS,都会出现很多关于哪个平台更好的争论,大多数的争论点都是关于市场占有率、易用性和设备分化等问题。当然也有一些以开发者的角度去比较这两个平台的文章,但是很少有从技术上做深入的比...

    Developer 评论0 收藏0
  • Android 和 iOS 孰优孰劣:真实应用开发过程告诉你答案

    摘要:最近我完成了和的开发。通过这次的实践,我希望透过独特的视角,分析和比较为这两个平台开发应用的过程。在上,屏幕翻转会直接销毁现有整个视图栈栈,屏幕翻转完成后再重建每个视图。 随便搜索一下Android vs. iOS,都会出现很多关于哪个平台更好的争论,大多数的争论点都是关于市场占有率、易用性和设备分化等问题。当然也有一些以开发者的角度去比较这两个平台的文章,但是很少有从技术上做深入的比...

    hearaway 评论0 收藏0
  • iOS开发②应用界面

    摘要:界面应用界面主要是使用框架开发,它有一套自己的模式,其中视图和控制器是中的及其子类和及其子类。应用界面构建层次一般情况下,用于中只包含一个。 iOS界面应用界面主要是使用Cocoa Touch框架开发,它有一套自己的MVC模式,其中视图和控制器是UIKit中的UIVIew及其子类和UIVIewController及其子类。 视图控制器 Cocoa Touch中UIVIewControl...

    liangzai_cool 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<