tableView - 批量操作

本文介绍如何在iOS应用中实现UITableView的自定义多选效果,包括如何通过监听选择事件来更新数据模型的状态,并在cell中展示相应的选中效果。此外,还提供了苹果自带多选功能的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义选中效果

  • 增加自定义选中图片,控制其显示和隐藏
  • 在数据模型中增加bool属性,默认为NO,判断是否隐藏
    • 不能直接对cell操作,否则在cell重用的时候会错
  • 监听didSelectRowAtIndexPath方法,然后对选中行的是否隐藏属性取反

  • 还一种思路就是可以将选中的数据模型保存在一个可变数组中进行操作(不推荐)

#pragma mark - TableView代理方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 取消选中这一行,选中灰色一闪消失
    // 通过面板取消选中,选中颜色不会出现
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    // 模型的打钩属性取反
    WQDeal *deal = self.deals[indexPath.row];
    deal.checked = !deal.isChecked;

    // 刷新表格
    [tableView reloadData];
}
  • 在cellForRowAtIndexPath每个cell设置数据的时候,进行勾号的显示和隐藏操作
- (void)setDeal:(XMGDeal *)deal
{
    _deal = deal;

    // 设置数据
    self.iconView.image = [UIImage imageNamed:deal.icon];
    self.titleLabel.text = deal.title;
    self.priceLabel.text = [NSString stringWithFormat:@"¥%@", deal.price];
    self.buyCountLabel.text = [NSString stringWithFormat:@"%@人已购买", deal.buyCount];

    // 设置打钩控件的显示和隐藏
    self.checkView.hidden = !deal.isChecked;
}

苹果自带的多选

  • 在初始化的时候允许在编辑模式多选操作
self.tableView.allowsMultipleSelection = YES;
  • 删除选中行,系统记住行号进行操作
// 获得所有被选中的行
NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];

// 便利所有的行号
NSMutableArray *deletedDeals = [NSMutableArray array];
for (NSIndexPath *path in indexPaths) {
    [deletedDeals addObject:self.deals[path.row]];
}

// 删除模型数据
[self.deals removeObjectsInArray:deletedDeals];

// 刷新表格
[self.tableView reloadData];

这里写图片描述

namespace view::equipment { equipment_home::equipment_home(QWidget *parent) : QWidget(parent), ui(new view::equipment::Ui::equipment_home) { ui->setupUi(this); data::Equipment::buildDB(); data::Equipment::EquipmentClass::createEquipmentClassTable(); data::Equipment::EquipmentInstnace::createEquipmentInstanceTable(); //初始化模型 dataModel::EquipmentDataModel *modelRent = new dataModel::EquipmentDataModel(this); fliterModel::FilterProxyMdel *rentFilterProxyMdel = new fliterModel::FilterProxyMdel(this); rentFilterProxyMdel->setSourceModel(modelRent); //给视图指定模型 ui->tableView->setModel(rentFilterProxyMdel); ui->tableView->hideColumn(dataModel::EquipmentDataModel::Col_ID); ui->tableView->hideColumn(dataModel::EquipmentDataModel::Col_Count); ui->tableView->hideColumn(dataModel::EquipmentDataModel::Col_RentId); ui->tableView->hideColumn(dataModel::EquipmentDataModel::Col_ClassId); // 调整列宽以显示数据 ui->tableView->resizeColumnsToContents(); ui->tableView->horizontalHeader()->setStretchLastSection(true); // 加载数据 modelRent->fetchData(); // 调试信息 qDebug() << "Model row count:" << modelRent->rowCount(); qDebug() << "Model column count:" << modelRent->columnCount(); } 根据它完善下列代码: void equipment_home::on_kadd_clicked() //添加器材 { // 创建对话框并设置父对象(自动内存管理) kaddmanage *dialog = new kaddmanage(this); // 连接对话框的dataAdded信号到主界面的刷新函数(on_kreall_clicked) connect(dialog, &kaddmanage::dataAdded, this, [this]() { on_kreall_clicked(); // 调用整理库数据功能,刷新tableView }); // 显示对话框(模态或非模态均可,此处用show()非模态) dialog->show(); } void equipment_home::on_kreall_clicked() //整理库数据 { // 1. 确保数据库及表结构存在(原有功能) // 2. 加载所有设备完整记录 QList<data::Equipment::fullEquipmentRecord> records = data::Equipment::loadFullEquipmentRecords(); // 3. 按 "item" 字段升序排序(假设 "item" 对应设备名称 "name" 字段) // 使用 Qt 的字符串比较(支持本地化,类似Excel排序) std::sort(records.begin(), records.end(), [](const data::Equipment::fullEquipmentRecord& a, const data::Equipment::fullEquipmentRecord& b) { return QString::localeAwareCompare(a.name, b.name) < 0; // 升序排列 }); // 4. 将排序后的数据展示到 tableView(假设 UI 中构件名为 tableView) // 清空原有数据 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(ui->tableView->model()); if (!model) { model = new QStandardItemModel(this); // 设置表头(仅首次初始化时设置) model->setHorizontalHeaderLabels({ "ID", "设备名称", "状态","类别名称", "创建时间" }); ui->tableView->setModel(model); } model->removeRows(0, model->rowCount()); // 清空旧数据 // 填充排序后的数据 for (const auto& rec : records) { QList<QStandardItem*> items; items << new QStandardItem(QString::number(rec.id)) // ID << new QStandardItem(rec.name) // 设备名称(排序字段) << new QStandardItem(rec.status) // 状态 << new QStandardItem(rec.inDate.toString("yyyy-MM-dd hh:mm:ss")) // 创建时间 << new QStandardItem(QString::number(rec.class_id)) // 类别ID << new QStandardItem(rec.type); // 类别名称 model->appendRow(items); } // 可选:自动调整列宽 ui->tableView->resizeColumnsToContents(); log(service::LogLevel::INFO) << "数据库整理完成"; }
最新发布
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值