快速按下按钮,检查是否选择了单元格

时间:2018-09-18 09:34:50

标签: ios swift uitableview

UI photo

在这张照片中,您可以看到用户可以打开或关闭每个单元的开关。最后,当用户按下按钮时,我需要将选定的单元格(具有打开状态的单元格)添加到数组中,以将其发送到API。

当用户单击按钮(位于屏幕底部)时,我应该获得unitNopersonId并将它们存储在我的结构中

我的模型:

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个属性。

演示者代表这一点:

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")
    }
}

4 个答案:

答案 0 :(得分:2)

您的第一个问题是,您需要以某种方式将开关状态存储在视图控制器中;您不能将其直接存储在单元格中,因为表格视图滚动时会重复使用单元格。

虽然您可以将开关状态存储在模型结构中,但我可能不会这样做,因为这会使您的结构可变。我会使用csv来跟踪选择。

您的下一个问题是知道何时在单元格中更改开关。您可以为您的Set<IndexPath>子类提供一个闭包来处理此问题。

SmsCell

UITableviewCell

视图控制器

var switchHandler: ((Bool)->Void)?

@IBAction func switchChanged(_ sender: UISwitch) {
    self.switchHandler?(sender.isOn)
}

您的最终任务是创建可编码为所需JSON的结构:

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
}

视图控制器

struct Itemm: Codable {
    let unitNo: Int
    let personId: Int
}

struct Welcome: Codable {
    var items:[Itemm]
}

答案 1 :(得分:1)

好吧,据我从您要尝试做的事情中得到的

1-给出switch标签,

内部
    func onSwitchValueChanged(_ switch: UISwitch) {
       if switch.on {
       selectedArray.append(dataArray[switch.tag])
    } esle {
      selectedArray.remove(at: switch.tag)
}

在Switch的didChange方法中,

<li
      routerLinkActive="active"
      routerLink="/dashboard"
      matTooltip="TEst"
      matTooltipPosition="after">
      <span class="icon-dashboard"></span>
    </li>

答案 2 :(得分:0)

SmsCell

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
}


struct Itemm: Codable {
    let unitNo: Int
    let personId: Int
}

struct Welcome: Codable {
    var items:[Itemm]
}

视图控制器

  @IBAction func sendButtonTapped(_ sender: UIButton) {

      var items = [[String:Int]]()
for indexPath in self.selectedCells {
    let data = self.data![indexPath.section]
    let contact = data.contacts[indexPath.row]
    items.append(["Number" : data.unitNo, "ID" : contact!.id])
}
let welcome = ["items" : items]
print(welcome)
Presenter.sendSmsForAllTheMembers(AptId: aptId, data: welcome)
    }

最终答案是一些人在这里给我的答案和一些我自己发现的答案的组合

答案 3 :(得分:-1)

您可以在打开/关闭功能时更新模型对象,也可以将开关标签指定为cell.indexpath

更新像这样的Ex的模型对象:-

if switch == on {

 items[switch_tag].unitNo =0 

} else {

  items[switch_tag].unitNo =1 
}