swift详解之十九--------------UITableView的基本操作(下拉刷新,新增删除,分组,检索等)

UITableView的基本操作(下拉刷新,新增删除,分组,检索等)

注:本小结总结UITableview的一些基本用法



UITbleView继承自UIScrollView,只能用来显示一列数据(目前就只认识到这里),纵向滑动。

一般有两种方式来实现,直接用UITableViewController , 占满整个屏幕 。不用手动实现UITableViewDataSourceUITableViewDelegate 。另一种方式在UIViewController 中。我们看看这种方式

let table = UITableView()
table.frame = self.view.frame
self.view = table
table.delegate = self
table.dataSource = self

这里新建了一个UITableView ,并且将其frame设置成当前view的frame大小 。也就是占满屏幕 。当然这里 你也可以设置你需要的大小, 下面的两句就是将它的代理和数据源的协议 设置成当前对象 当然我们的viewcontroller是实现了这两个协议的。class ViewController: UIViewController , UITableViewDataSource , UITableViewDelegate

然后,把这个tableview添加到当前view上 或者直接把当前view赋值成它。

下面看几个主要的代理方法

//返回多少个section
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {

        return 3
    }

返回section数, section相当于分组 ,也就是这里table分成几组 。我们这里分三组演示。

   func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        switch section {
            case 0 :
                return arr.count
            case 1:
                return arr1.count
            case 2:
                return arr2.count
            default:
                return 0
        }

    }

然后这个方法就是每组的元素个数 。这里我们用了三个数组

func initData(){

       arr.addObject("ssssddd")
       arr.addObject("唱什么")
       arr.addObject("what ")
       arr.addObject("ssshenme dd")

       arr1.addObject("我是二部的")

       arr2.addObject("我是第三个部门的")
       arr2.addObject("我是第三个部门的1")
    }

我们在这里初始化了这三个数组 。在viewDidLoad 下调用。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let strCell = "cell"
        var cell =   tableView.dequeueReusableCellWithIdentifier(strCell)
        if cell == nil{
            cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: strCell)
         }

        switch indexPath.section{
            case 0 :
                cell!.textLabel?.text = arr[indexPath.row] as? String
            case 1:
                cell!.textLabel?.text = arr1[indexPath.row] as? String
            case 2:
                cell!.textLabel?.text = arr2[indexPath.row] as? String
            default:
               cell!.textLabel?.text = ""
        }

        //cell!.textLabel?.text = arr[indexPath.row] as? String
        cell!.backgroundColor=UIColor.purpleColor()
        cell?.contentView.backgroundColor = UIColor.grayColor()
        return cell!
    }

这个也是最主要的方法 ,给cell赋值 。这里先从tableView.dequeueReusableCellWithIdentifier 这个里面去取 , 没有的时候 才会去新建 ,因为下载过的数据是回缓存起来的。我们需要先从缓存池里面找。找不到采取新建,这样会比较流畅。

var refreshControl:UIRefreshControl? 

这里我们声明一个刷新控件

self.refreshControl = UIRefreshControl()
self.refreshControl?.addTarget(self, action: "onPullToFresh", forControlEvents: UIControlEvents.ValueChanged)
self.refreshControl?.attributedTitle=NSAttributedString(string: "松手就可以刷新啦")
self.table.addSubview(refreshControl!)

这里设置下舒心控件的属性和给它注册方法onPullToFresh

 func onPullToFresh(){

        //下拉刷新
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
            self.arr.addObject("ssssddd")
            self.arr1.addObject("唱什么")
            self.arr2.addObject("what ")
            self.arr1.addObject("ssshenme dd")
            dispatch_async(dispatch_get_main_queue(), {
                self.table.reloadData()
                self.refreshControl?.endRefreshing()
            })
        }

    }

这个下拉刷新,先去异步添加数据 ,我们这里是手动添加进去的,但是实际应用中往往需要从网络去下载数据,所以比较慢,用异步会比较合适。下载完成后,回到主线程去重新加载数据 , 最后停止下拉刷新控件 。

table.editing = true

这里我们设置这个属性后, tableview可以编辑 , 新增删除等 。(不加这个属性只能左划删除 )

 func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if(editingStyle == UITableViewCellEditingStyle.Delete){ //delete

            switch indexPath.section {
                case 0 :
                    arr.removeObjectAtIndex(indexPath.row)
                case 1:
                    arr1.removeObjectAtIndex(indexPath.row)
                case 2:
                    arr2.removeObjectAtIndex(indexPath.row)
                default:
                    print("no")
            }

            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)

        }else if(editingStyle == UITableViewCellEditingStyle.Insert){

            switch indexPath.section {
            case 0 :
                arr.insertObject("新增的??", atIndex: indexPath.row+1)
            case 1:
                arr1.insertObject("新增的??", atIndex: indexPath.row+1)
            case 2:
                arr2.insertObject("新增的??", atIndex: indexPath.row+1)
            default:
                print("no")
            }

            let zyIndexPath = NSIndexPath (forRow: indexPath.row+1, inSection: indexPath.section)
            tableView.insertRowsAtIndexPaths([zyIndexPath], withRowAnimation: UITableViewRowAnimation.Middle)
        }
    }

    func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
        if(indexPath.row % 2 == 1){
            return UITableViewCellEditingStyle.Insert
        }
        else{
            return UITableViewCellEditingStyle.Delete
        }

    }

然后再实现这两个方法。看下效果 、

这里可以新增和删除 。

旁边的检索这个方法

 func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
        return ["第一组","第二组","第三组"]
    }

点击可以用这个方法

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("我点击了第\(indexPath.section)部分,第\(indexPath.row)行")
    }

当然还有很多方法。大家可以输入tableview 会提示很多,大家可以去试试。这里不再赘述。

还是放上源码 :UITableView基本用法大全

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-19 02:26:13

swift详解之十九--------------UITableView的基本操作(下拉刷新,新增删除,分组,检索等)的相关文章

Android实战简易教程-第十九枪(SwipeRefreshLayout下拉刷新使用实例)

我们来看SwipeRefreshLayout的具体用法,顾名思义此组件就是一个布局,只不过要注意的是此布局内只能有一个直接子View.其实通过文档我们可以知道SwipeRefreshLayout只不过是继承了ViewGroup. 查看文档,我们可以知道,在SwipRefreshLayout中存在一个接口,通过此接口我们可以监听滑动手势,其实使用此组件最重要的步骤就是实现此接口的onRefresh方法,在此方法中实现数据的更新操作.如下: 接口中的方法: 除了OnRefreshListener接口

swift详解之十-------------异常处理、类型转换 ( Any and AnyObject )

异常处理.类型转换 ( Any and AnyObject ) 1.错误处理 (异常处理) swift 提供第一类错误支持 ,包括在运行时抛出 ,捕获 , 传送和控制可回收错误.在swift中 ,错误用复合 ErrorType 协议的值表示 . Swift枚举把一系列相关的错误组合在一起.同时可以把一些相关的值和错误关联在一起 . 因此 编译器会为实现ErrorType协议的Swift枚举类型自动实现相应的合成 这里看个很简单的小例子. enum WrongName:ErrorType{ cas

swift详解之十四 -----------NSThread 异步下载图片

NSThread 异步下载图片 在IOS中处理多线程有三个方案 , NSThread .NSOperation .GCD .当然GCD应该是最方便的 ,我们一个一个学 .先理解底层的,最后再使用最方便的 . NSThread: 优点:NSThread 比其他两个轻量级 缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 我们先研究下用NSThread 异步加载网络图片 : NSThread有两种创建方式 ,一种是通过实例方法.一种是通过类方法. let threa

swift详解之十二-----------------泛型

泛型 注:本文详细讲解泛型,对写一些公共方法,共用的东西的时候很有帮助.想成为一个优秀的程序员吗?这个必须掌握 泛型代码可以让你写出根据自我需求定义.适用于任何类型的,灵活可重用的函数和类型. 下面直接看一个简单的示例 , 泛型其实就是在写的时候不指定是哪种类型 , 只有再用得时候才指定类型 ,这些类型可以给一些限定.例如 Array Dictionary 等 写一个简单的交换数据的方法,不限定类型 func swapTwoValue<T>(inout a:T,inout _ b:T){ le

swift详解之十八------------ScrollView

ScrollView 注:本小节详细介绍scrollView的用法 UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容 UIScrollView的用法,将需要展示的内容添加到UIScrollView中 设置UIScrollView的contentView属性,告诉UIScrollView所有内容的尺寸 let scroll = UIScrollView(); scroll.backgroundColor = UIColor.grayColor

swift详解之十六-----------GCD基础部分

GCD基础部分 注:本节主要详细讲解线程同步的一些基本概念和GCD基础部分 GCD (Grand Central Dispatch) 首先我们来了解处理线程中的一些基本概念 : 串行:同时只能有一个任务被执行 并发:同时可以有多个任务执行 同步:同步任务会阻塞当前线程,知道任务完成 异步:预定的任务会完成但不会等它完成,因此,一个异步函数不会阻塞当前线程去执行下一个函数. 临界区:就是一段代码不能被并发执行,也就是,两个线程不能同时执行这段代码.(不同代码去操作共享资源可能会变质) 死锁:多个线

swift详解之十五------------NSThread线程同步锁

NSThread线程同步锁 上小节用NSThread实现读取网络图片 , 这节用NSThread 模拟一个卖票的例子 .用NSLock 或者NSCondition 锁定资源 var total = 100 //总票数 var w1 = 0 //窗口1卖出票数 var w2 = 0 //窗口2卖出票数 var isSell = true //是否出售 var lock:NSLock? var condition:NSCondition? 这里首先定义一些变量 然后再点击卖票的时候,开启连个线程模仿

Android第二十三期 - 256k的ListView下拉刷新和滚动加载数据

代码已经

iOS 下拉刷新和加载更多 (OC\Swift)

Swift语言出来之后, 可能还没有第三方的下拉刷新和上提加载, 所以自己用UIRefreshControl控件和UITableView实例的tableFooterView(底部视图)属性结合起来写了一个下拉刷新和点击加载更多的基本实现, 分为OC的代码实现和Swift的代码实现, 希望大家可以指出不足: Swift代码: 1 import UIKit 2 3 class ViewController: UITableViewController { 4 5 // 用于显示的数据源 6 var