复选-swift tableview 刷新

问题描述

swift tableview 刷新

小弟在编写复选列表(用tableview 的每一个 cell 装每一个选项)时遇到刷新问题,点击刷新后,被选中的文件若上传成功,则在列表中不再显示,但是上传成功后刷新列表,原本存在的被选中的cell(用image标识)中的image下移到另一个cell中了。求大神帮我解决这个问题!!!!

或者求大神提供一个“复选列表”带自动刷新的可行方法!求大神帮忙小弟度过这个紧急时刻!

解决方案

好吧,最后我解决了这个问题,方案如下:
1.设置一个全局变量flag,当做刷新的标志位,
2.确定总共上传x个文件,把标志位置成x,每上传成功一次,标志位自减1;
3因为 tableview?.reloadData() 时,有多少个cell,便会调用多少次 tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell ,所以 每加载一个cell时都可判断一下 if(flag >=0){把cell的“button图片” —> “未选中button图片”,flag--;}else{flag = -1}

4.其余时候下的刷新(比如说下拉刷新)flag < 0, 并不会更新每个cell中button的图片。

5.如果我解释的不清楚,或者有什么更好的方式,请联系我!

部分代码如下:(有很多函数都是自己写的,看起来比较乱,请见谅 )

/*上传*/
func uploadClicked(){
    prepareForUpload()
    uploadAudioAndImage(uploadAudioID, ID : ID , insuranceID: insuranceID, idataIcard: idataIcard, userCode: userCode)
    uploadVideo(uploadVideoID,  ID : ID , insuranceID: insuranceID, idataIcard: idataIcard, userCode: userCode)
    timer = NSTimer.scheduledTimerWithTimeInterval(1,
        target:self,selector:Selector("tickDown"),
        userInfo:nil,repeats:true)
    upload.enabled = false
    upload.setTitle("正在上传", forState: UIControlState.Normal)

    coverView = UIView(frame: CGRectMake(0, 130, self.view.frame.size.width, self.view.frame.size.height))
    coverView!.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1)
    self.view!.addSubview(coverView!)
}

/*轮询是否上传完成*/
func tickDown(){
    let defaults = NSUserDefaults.standardUserDefaults()
    let temp = defaults.integerForKey("temp_done")
    if(temp == 0){
        upload.enabled = true
        upload.setTitle("上传资料", forState: UIControlState.Normal)
        coverView?.removeFromSuperview()
        rfClick()
        timer.invalidate()
    }
}

        /*上传完成后,刷新页面*/
func rfClick(){
    audioID = searchAudioID(insuranceID)
    videoID = searchVideoID(insuranceID)
    //maintableview?.reloadData()
    dispatch_async(dispatch_get_main_queue(), {
        self.flag = self.audioID.count + self.videoID.count
        self.maintableview?.reloadData()
        })
}

//flag 为全局变量,常态时置成 -1(上传完成,flag置成 -1)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:(UITableViewCell) = UITableViewCell(style:.Default,reuseIdentifier:"Identifier") as UITableViewCell
if(indexPath.section==0){
let cell:audioCheckboxTableViewCell = maintableview!.dequeueReusableCellWithIdentifier("audioCheckboxTableViewCell", forIndexPath: indexPath) as! audioCheckboxTableViewCell
cell.audioName.text = (audioID[indexPath.row]["audio_id"]as? String)!
cell.tag = 0
if flag > 0
{
flag--
cell.butSelect.setImage(UIImage(named: "fx_02"), forState: UIControlState.Normal)
}else{flag = -1}
cell.textLabel!.font = UIFont.systemFontOfSize(14)
cell.selectionStyle = UITableViewCellSelectionStyle.None
return cell
}
if(indexPath.section==1){
let cell:videoCheckboxTableViewCell = maintableview!.dequeueReusableCellWithIdentifier("videoCheckboxTableViewCell", forIndexPath: indexPath) as! videoCheckboxTableViewCell
cell.videoName.text = (videoID[indexPath.row]["VIDEO_ID"]as? String)!
cell.tag = 1
if flag > 0
{
flag--
cell.butSelect.setImage(UIImage(named: "fx_02"), forState: UIControlState.Normal)
}else{flag = -1}
//cell向右箭头
cell.accessoryType = UITableViewCellAccessoryType.None
cell.textLabel!.font = UIFont.systemFontOfSize(14)
cell.selectionStyle = UITableViewCellSelectionStyle.None
return cell
}
//cell向右选择箭头
cell.accessoryType = UITableViewCellAccessoryType.None
cell.textLabel!.font = UIFont.systemFontOfSize(14)
cell.selectionStyle = UITableViewCellSelectionStyle.None
return cell
}

解决方案二:

tableview的局部刷新逻辑,通常是为了实现某一些或者一组效果,依赖于三个函数,reload,delete,insert。tableview的很多很炫的动画效果都是以此来实现,但是这几个函数,对cell高度可变的table的局部刷新作用,个人觉得是影响体验的,每一个cell第一次配置好之后,第二次再reload一遍,也是一个窝火的事情。但是,but,哈哈,你懂的,如果你想对特定的cell做一些效果,他们真的是,太好用咯。 --- likendsl

这次来说说像reeder那样上下拖动切换的效果是如何做的。
如何触发这里就不多说了,靠contentofset也可以,按钮也可以。
这里主要介绍一下这种效果的3种做法,各有好处。
第一种:如图一。提前预加载好3个view,比如往下翻的时候,就将view C 移到view B,view B移到view A, view A重新加载。这样做的好处就是展示的效果比较好,可控性高。代码见http://www.minroad.com/?p=286

图1
第二种方法:利用tableview来做。在tableview的一层中套入一个view,同样预加载view A B C ,每一次都只要把要显示view加入到tableview中的view上,并利用reload cell来刷新一下。这种做的好处就是简单,对代码水平要求不高,但是与第一次效果相比略显粗糙,可扩展性不强。
比如要将下拖的时候,将cell2中的view B删除,加入view C,然后调用
NSIndexPath *path = [NSIndexPath indexPathForRow:1 inSection:0]; //指向cell2的path
[self.tableview reloadRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:
UITableViewRowAnimationBottom];//刷新

图2
第三种方法:同样是tableview,但是这次不需要预加载,优点就是对于tableview相当实用,处理也比较简单。缺点同方法二,见图3.
比如要将cell1 cell2 cell3向前滚动,用cell4,cell5,cell6代替。可以执行以下代码
[self.tableview beginUpdates];
NSIndexPath *path1 = [NSIndexPath indexPathForRow:0 inSection:0];
NSIndexPath *path2 = [NSIndexPath indexPathForRow:1 inSection:0];
NSIndexPath *path3 = [NSIndexPath indexPathForRow:2 inSection:0];
//更新tableview delegate中的数据,cell数量等于删除之后的数量相同,否则会出错
[self.tableview deleteRowsAtIndexPaths:[NSArray arrayWithObjects:path1,path2,path3,nil] withRowAnimation:UITableViewRowAnimationTop];
//更新tableview delegate datasource,cell的数量是添加之后的,同时数据是新的
[self.tableview insertRowsAtIndexPaths:[NSArray arrayWithObjects:path1,path2,path3,nil] withRowAnimation:UITableViewRowAnimationTop];
[self.tableview endUpdates];
这样相当于把原来该是cell4,cell5,cell6中的数据从下向上到cell1,cell2,cell3的位置。

解决方案三:

tableView的刷新
Swift - TableView
swift入门之TableView

解决方案四:

好吧,最后我解决了这个问题,方案如下:
1.设置一个全局变量flag,当做刷新的标志位,
2.确定总共上传x个文件,把标志位置成x,每上传成功一次,标志位自减1;
3因为 tableview?.reloadData() 时,有多少个cell,便会调用多少次 tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell ,所以 每加载一个cell时都可判断一下 if(flag >=0){把cell的“button图片” —> “未选中button图片”,flag--;}else{flag = -1}

4.其余时候下的刷新(比如说下拉刷新)flag < 0, 并不会更新每个cell中button的图片。

5.如果我解释的不清楚,或者有什么更好的方式,请联系我!

部分代码如下:(有很多函数都是自己写的,看起来比较乱,请见谅 )

/*上传*/
func uploadClicked(){
    prepareForUpload()
    uploadAudioAndImage(uploadAudioID, ID : ID , insuranceID: insuranceID, idataIcard: idataIcard, userCode: userCode)
    uploadVideo(uploadVideoID,  ID : ID , insuranceID: insuranceID, idataIcard: idataIcard, userCode: userCode)
    timer = NSTimer.scheduledTimerWithTimeInterval(1,
        target:self,selector:Selector("tickDown"),
        userInfo:nil,repeats:true)
    upload.enabled = false
    upload.setTitle("正在上传", forState: UIControlState.Normal)

    coverView = UIView(frame: CGRectMake(0, 130, self.view.frame.size.width, self.view.frame.size.height))
    coverView!.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1)
    self.view!.addSubview(coverView!)
}

/*轮询是否上传完成*/
func tickDown(){
    let defaults = NSUserDefaults.standardUserDefaults()
    let temp = defaults.integerForKey("temp_done")
    if(temp == 0){
        upload.enabled = true
        upload.setTitle("上传资料", forState: UIControlState.Normal)
        coverView?.removeFromSuperview()
        rfClick()
        timer.invalidate()
    }
}

        /*上传完成后,刷新页面*/
func rfClick(){
    audioID = searchAudioID(insuranceID)
    videoID = searchVideoID(insuranceID)
    //maintableview?.reloadData()
    dispatch_async(dispatch_get_main_queue(), {
        self.flag = self.audioID.count + self.videoID.count
        self.maintableview?.reloadData()
        })
}

//flag 为全局变量,常态时置成 -1(上传完成,flag置成 -1)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:(UITableViewCell) = UITableViewCell(style:.Default,reuseIdentifier:"Identifier") as UITableViewCell
if(indexPath.section==0){
let cell:audioCheckboxTableViewCell = maintableview!.dequeueReusableCellWithIdentifier("audioCheckboxTableViewCell", forIndexPath: indexPath) as! audioCheckboxTableViewCell
cell.audioName.text = (audioID[indexPath.row]["audio_id"]as? String)!
cell.tag = 0
if flag > 0
{
flag--
cell.butSelect.setImage(UIImage(named: "fx_02"), forState: UIControlState.Normal)
}else{flag = -1}
cell.textLabel!.font = UIFont.systemFontOfSize(14)
cell.selectionStyle = UITableViewCellSelectionStyle.None
return cell
}
if(indexPath.section==1){
let cell:videoCheckboxTableViewCell = maintableview!.dequeueReusableCellWithIdentifier("videoCheckboxTableViewCell", forIndexPath: indexPath) as! videoCheckboxTableViewCell
cell.videoName.text = (videoID[indexPath.row]["VIDEO_ID"]as? String)!
cell.tag = 1
if flag > 0
{
flag--
cell.butSelect.setImage(UIImage(named: "fx_02"), forState: UIControlState.Normal)
}else{flag = -1}
//cell向右箭头
cell.accessoryType = UITableViewCellAccessoryType.None
cell.textLabel!.font = UIFont.systemFontOfSize(14)
cell.selectionStyle = UITableViewCellSelectionStyle.None
return cell
}
//cell向右选择箭头
cell.accessoryType = UITableViewCellAccessoryType.None
cell.textLabel!.font = UIFont.systemFontOfSize(14)
cell.selectionStyle = UITableViewCellSelectionStyle.None
return cell
}

解决方案五:

你用一个数组来维护数据,每一个数组元素都是cell对应的数据,显示cell的时候,根据数组来处理,需要刷新的时候就是reloadData重新加载

时间: 2024-08-02 21:20:22

复选-swift tableview 刷新的相关文章

Swift tableView的单元格多选功能的实现(获取多选值、多选删除)

有时候在我们应用中需要用到表格(tableView)的多选功能.其实 tableView 已自带了多种多选功能,不用借助第三方组件也可以实现.下面分别进行介绍. 方法1,自定义一个数组保存选中项的索引(非编辑状态) (1)我们先定义一个数组,表格在非编辑状态时,点击某个单元格便将其索引添加到这个数组中.同时将单元格尾部打勾表示选中状态.再次点击原来选中的单元格,则取消选中状态,并将索引从数组中移除. (2)点击导航栏上的"确定"按钮,即可获取到所有选中项的索引以及对应的值,并打印出来.

Qt之QTableView添加复选框(QAbstractTableModel)

简述 使用QTableView,经常会遇到复选框,要实现一个好的复选框,除了常规的功能外,还应注意以下几点: 三态:不选/半选/全选 自定义风格(样式) 下面我们介绍一下常见的实现方式: 编辑委托. 方式:利用委托重载createEditor(),激活QCheckBox. 特点:必须双击/选中,才能显示CheckBox控件.一般不满足实际中的直接显示的需要. 使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget

Extjs 点击复选框在表格中增加相关信息行_javascript技巧

功能效果:点击复选框在表格中自动增加相关信息行,复选框取消则表格中内容自动删除 初始效果大概是这样~~~~~ // 定义初始 存放表格数据 var gridItems = []; //省份复选框 var $provinceCheckbox01 = new Ext.form.CheckboxGroup({ xtype: 'checkboxgroup', fieldLabel: '省份选择', labelWidth: 60, columns: 9, vertical: true, margin: '

Qt之QTableView添加复选框(QAbstractItemDelegate)

简述 上节分享了使用自定义模型QAbstractTableModel来实现复选框.下面我们来介绍另外一种方式: 自定义委托-QAbstractItemDelegate. 简述 效果 QAbstractTableModel 源码 接口说明 QStyledItemDelegate 源码 接口说明 样式 使用 效果 QAbstractTableModel 源码 table_model.cpp #define CHECK_BOX_COLUMN 0 #define File_PATH_COLUMN 1 T

在jquery repeater中添加设置日期,下拉,复选框等控件_实用技巧

如果, 有不明白的问题, 请先阅读 30 分钟掌握无刷新 Repeater. 示例代码下载: http://zsharedcode.googlecode.com/files/JQueryElementDemo.rar 本文将详细的讲解 Repeater 控件的模板中如何处理控件, 目录如下: * 准备 * html 元素 * 文本框 * 下拉框 * 多行文本框 * 复选框 * jQueryUI 插件 * jQueryUI 日期框 * jQueryUI 按钮 * jQueryUI 自动匹配 示例图

yii 使用checkBoxList 生成复选框每个复选框前面会生成隐藏输入框 怎么不让它生成

问题描述 yii 使用checkBoxList 生成复选框每个复选框前面会生成隐藏输入框 怎么不让它生成 yii 使用checkBoxList 生成复选框时会在每个复选框前面生成隐藏输入框 怎么不让他生成隐藏输入框 解决方案 手册里面有,或者你用html替换掉它里面生成的html标签去定义样式

android-Android 中带复选框的对话框

问题描述 Android 中带复选框的对话框 下面是关于带有复选框的对话框事例: final int DIALOG_ITEMS = 1; String data[] = { "one", "two", "three", "four" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceStat

lotus表单中勾选某一列前的复选框,则这个列下的富文本域由灰色,变成可以上传的正常状态?怎么做?

问题描述 lotus表单中勾选某一列前的复选框,则这个列下的富文本域由灰色,变成可以上传的正常状态?怎么做? 可以在表单中做到这样的效果吗:勾选某一列前的复选框,则这个列下的富文本域由灰色(不可上传),变成可以上传的正常状态?怎么做?

listview-在Android中如何自定义复选框?

问题描述 在Android中如何自定义复选框? 我想显示像 Radio button 这样的复选框,是否能自己定义复选框的形状和大小呢? 大家做过类似的功能吗? 解决方案 使用这个代码: <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:button="@android:drawable/btn_radio"/