ios - 快速按下按钮时检查是否选择了单元格
问题描述
在这张照片中,您可以看到用户可以打开或关闭每个单元格的开关。最后,当用户按下按钮时,我需要将选定的单元格(打开开关的单元格)添加到数组中以将其发送到 API。
当用户单击按钮(在屏幕底部)时,我应该得到unitNo
andpersonId
并将它们存储在我的结构中
我的模型:
struct Itemm : Codable {
var unitNo:Int?
var personId:Int?
}
struct welcome {
var items : [Itemm?]
}
我必须发送一个如下所示的数组:
{
"items": [
{
"unitNo": 0,
"personId": 0
}
]
}
我对如何使用 if 语句访问 UIButton 中的单元格数据然后存储它们感到有些困惑。如果有任何帮助,我将不胜感激。
表视图:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell") as? SmsTableViewCell
cell?.PhonNumberLbl.text = data![indexPath.section].contacts[indexPath.row]?.phoneNumber
cell?.NameLbl.text = data![indexPath.section].contacts[indexPath.row]?.name
cell?.selectedTF.isOn = (data![indexPath.section].contacts[indexPath.row]?.selected)!
return cell!
}
API 响应:
[
{
"contacts": [
{
"id": 9827,
"selected": true,
"phoneNumber": "09203137745",
"name": "owner"
},
{
"id": 10159,
"selected": true,
"phoneNumber": "08523698522",
"name": "hff"
},
{
"id": 10161,
"selected": true,
"phoneNumber": "09586731218",
"name": "hjdldue"
}
],
"unitNo": 1,
"unitPlaque": "jack",
"billText": "texttext"
},
{
"contacts": [
{
"id": 10145,
"selected": true,
"phoneNumber": "09123809556",
"name": "mmm"
},
{
"id": 10160,
"selected": true,
"phoneNumber": "85233366888",
"name": "ttt"
}
],
"unitNo": 2,
"unitPlaque": "mm",
"billText": "texttext"
}
]
我想我没有清楚地解释我在寻找什么。
我调用的第一个方法是一种GET
方法,它为我提供了我在表中呈现的数据。用户只能更改开关,用户可以根据需要更改多次,直到他/她按下按钮(在屏幕底部)。
当按下按钮时,我需要获取每个单元格后面的隐藏数据并将它们存储在我的结构中并将其发送到具有另一种方法的 API。当用户按下按钮时,我需要从打开了开关的单元格中提取 2 个属性。
Presenter 表示:
func sendSmsForAllTheMembers(AptId:String , data:[String:Int])
{
ApiGenerator.request(targetApi: ApartemanService.sendSms(aptId: AptId, data: data), responseModel: Nil.self, success: { (response) in
if response.response.statusCode == 200 {
self.view?.SendingSmsSuccess()
}else {
do{
var errorMessage = try response.response.mapString()
errorMessage = errorMessage.replacingOccurrences(of: "\"", with: "",
options: NSString.CompareOptions.literal, range:nil)
self.view?.SendingSmsFailed(errorMessage: errorMessage)
}catch let error{
print(error)
self.view?.SendingSmsFailed(errorMessage: "error")
}
}
}) { (error) in
self.view?.SendingSmsFailed(errorMessage: "error")
}
}
解决方案
您的第一个问题是您需要以某种方式将开关状态存储在视图控制器中;您不能将其直接存储在单元格中,因为单元格在您的表格视图滚动时被重新使用。
虽然您可以将开关状态存储在模型结构中,但我可能不会这样做,因为它会使您的结构可变。我会使用 aSet<IndexPath>
来跟踪选择。
您的下一个问题是知道何时更改单元格中的开关。你可以为你的UITableviewCell
子类提供一个闭包来处理这个问题。
短信单元
var switchHandler: ((Bool)->Void)?
@IBAction func switchChanged(_ sender: UISwitch) {
self.switchHandler?(sender.isOn)
}
视图控制器
var selectedCells = Set<IndexPath>()
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell") as! SmsTableViewCell
let cellData = self.data![indexPath.section]
let contact = cellData.contacts[indexPath.row]
cell.PhonNumberLbl.text = contact.phoneNumber
cell.NameLbl.text = contact.name
cell.selectedTF.isOn = self.selectedCells.contains(indexPath)
cell.switchHandler = { (switchState) in
if switchState {
self.selectedCells.insert(indexPath)
} else {
self.selectedCells.remove(indexPath)
}
}
return cell
}
您的最终任务是创建可以编码为所需 JSON 的结构:
struct Itemm: Codable {
let unitNo: Int
let personId: Int
}
struct Welcome: Codable {
var items:[Itemm]
}
视图控制器
@IBAction func sendButtonTapped(_ sender: UIButton) {
var items = [Itemm]()
for indexPath in self.selectedCells {
let data = self.data![indexPath.section]
let contact = data.contacts[indexPath.row]
let newItem = Itemm(unitNo: data.unitNo, personId: contact.id)
items.append(newItem)
}
let welcome = Welcome(items: items)
// Now you can encode and send welcome
}
推荐阅读
- python - 在 Docker 中使用 Celery 的 Flask 应用程序中的应用程序上下文错误
- c - 没有循环的函数是否可并行化?
- java - 永久编辑类路径中的 txt 文件
- python - 如何从 txt 文件中绘制字符串日期时间
- dll - 在 .NetCore 2.1 (Windows) 中加载本机库
- reactjs - 为什么在我的测试中我的子组件上的道具没有更新?
- c# - 如何模拟 Elasticsearch NEST 的 IGetMappingResponse 进行单元测试
- c++ - 包装非类型模板常量以避免混合相同类型的参数
- python - 使用 Cython 公开 C 结构时的内存效率
- javascript - Jquery排序并给出正确或不正确的消息