Проверка, выделены ли ячейки или нет при нажатии кнопки, быстро - PullRequest
0 голосов
/ 18 сентября 2018

UI photo

На этом фото, как вы можете видеть, пользователь может включать или выключать переключатель для каждой ячейки.В конце, когда пользователь нажимает кнопку, мне нужно добавить выбранную ячейку (ячейки с включенным переключателем) в массив, чтобы отправить ее в API.

Когда пользователь нажимает кнопку (внизу)экрана) Я должен получить unitNo и personId и сохранить их в своей структуре

Моя модель:

struct Itemm : Codable {
    var unitNo:Int?
    var personId:Int?
}
struct welcome {
    var items : [Itemm?]
}

и яЯ должен отправить массив, как показано ниже:

{
  "items": [
    {
      "unitNo": 0,
      "personId": 0
    }
  ]
}

Я запутался в том, как мне получить доступ к данным ячейки в UIButton с помощью оператора if и затем сохранить их.Буду признателен за любую помощь.

Tableview:

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

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

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

окончательный ответ представляет собой комбинацию ответа, который некоторые люди дали мне здесь, а некоторые - что я нашел его сам

0 голосов
/ 18 сентября 2018

хорошо, насколько я понял из того, что вы пытаетесь сделать,

1 - дайте метку переключения,

внутри

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

}

И вМетод коммутатора didChange,

    func onSwitchValueChanged(_ switch: UISwitch) {
       if switch.on {
       selectedArray.append(dataArray[switch.tag])
    } esle {
      selectedArray.remove(at: switch.tag)
}
0 голосов
/ 18 сентября 2018

Ваша первая проблема заключается в том, что вам нужно как-то сохранить состояние переключателя в вашем контроллере вида;вы не можете сохранить его непосредственно в ячейке, поскольку ячейки повторно используются в качестве прокрутки табличного представления.

Хотя вы можете сохранить состояние переключателя в структуре модели, я бы, вероятно, этого не сделал, так какваша структура изменчива.Я бы использовал Set<IndexPath> для отслеживания выборов.

Ваша следующая проблема - знать, когда переключатель изменяется в ячейке.Вы можете предоставить закрытие для вашего UITableviewCell подкласса для обработки этого.

SmsCell

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

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

View Controller

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

View Controller

@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
}
0 голосов
/ 18 сентября 2018

Вы можете обновлять объекты модели при включении / выключении функции, а также присваивать метке переключателя значение cell.indexpath.

Обновить объекты модели, например, например: -

if switch == on {

 items[switch_tag].unitNo =0 

} else {

  items[switch_tag].unitNo =1 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...