簡體   English   中英

快速按下按鈕時檢查是否選擇了單元格

[英]Checking if cells are selected or not when button is pressed swift

UI照片

在這張照片中,您可以看到用戶可以打開或關閉每個單元的開關。 最后,當用戶按下按鈕時,我需要將選定的單元格(具有打開狀態的單元格)添加到數組中,以將其發送到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")
    }
}

您的第一個問題是,您需要以某種方式將開關狀態存儲在視圖控制器中。 您無法將其直接存儲在單元格中,因為表格視圖滾動時會重復使用單元格。

盡管您可以將開關狀態存儲在模型結構中,但我可能不會這樣做,因為這會使您的結構可變。 我將使用Set<IndexPath>來跟蹤選擇。

您的下一個問題是知道何時在單元中更改開關。 您可以為UITableviewCell子類提供一個閉包來處理此問題。

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
}

最后的任務是創建可編碼為所需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
}

好吧,就我從你想做什么中得到的

1-給開關標簽,

在 - 的里面

    func tableView(_ tableView: UITableView, 
      cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      switch.tag = indexPath.row
      switch.addTarget(self, action: #selector(onSwitchValueChanged), for: .touchUpInside)

}

在Switch的didChange方法中

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

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

最終的答案是一些人在這里給我的答案和一些我自己發現的答案的組合

您可以在打開/關閉功能時更新Model對象,也可以將switch標簽指定為cell.indexpath

更新像這樣的Ex的模型對象:

if switch == on {

 items[switch_tag].unitNo =0 

} else {

  items[switch_tag].unitNo =1 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM