Ограничить просмотр таблицы, если не выбрать все ячейки в Swift - PullRequest
0 голосов
/ 24 мая 2018

У меня есть табличное представление, в котором я заполняю данные, получаемые из моего сервиса.данные являются полностью динамическими, и табличное представление содержит разделы и ячейку под ним, все вещи являются динамическими.У меня есть действие кнопки за пределами табличного представления, которое используется для добавления выбранных данных ячейки.Теперь я хочу ограничить кнопку тем, что она не добавляет данные, пока не будут выбраны все ячейки под разделами.Я хочу, чтобы пользователь сначала проверил ячейки, а затем добавил кнопку добавления.Мой код для табличного представления таков:

func numberOfSections(in tableView: UITableView) -> Int {

        return AddonCategoryModel!.count
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

         return AddonCategoryModel![section].name
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 34
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

         return 50
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return AddonCategoryModel![section].addonItems.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = addonTableView.dequeueReusableCell(withIdentifier: "addonCell", for: indexPath) as! RestaurantMenuDetailAddonTVC

        cell.addonTitleLbl.text = AddonCategoryModel![indexPath.section].addonItems[indexPath.row].name
        cell.priceLbl.text = String(AddonCategoryModel![indexPath.section].addonItems[indexPath.row].price)


        if selection[indexPath.section].isSelected[indexPath.row] {
             cell.radioBtn.setImage(UIImage (named: "radio"), for: UIControlState.normal)
          addonItemName = cell.addonTitleLbl.text!
          addonItemprice = AddonCategoryModel![indexPath.section].addonItems[indexPath.row].price
          addonItemId = AddonCategoryModel![indexPath.section].addonItems[indexPath.row].addonPKcode
          addonItemNameArray.append(addonItemName)
          addonItemPriceArray.append(addonItemprice)
          addonItemIdArray.append(addonItemId)

          let defaults = UserDefaults.standard
            defaults.set(addonItemName, forKey: "addonItemName")
            defaults.set(addonItemprice, forKey: "addonItemPrice")
            defaults.set(addonItemId, forKey: "addonItemId")

            defaults.synchronize()

        }
        else {

            cell.radioBtn.setImage(UIImage (named: "uncheckRadio"), for: UIControlState.normal)
        }

        cell.radioBtn.tag = indexPath.row

// cell.radioBtn.addTarget (self, action: #selector (checkBoxSelection (_ :)), для: .touchUpInside) cell.selectionStyle =.none cell.backgroundColor = UIColor.clear возвращаемая ячейка}

Мой экран выглядит следующим образом, enter image description here

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я создал демо. Допустим, у вас есть два класса Model:

class AddOnCategoryModel {
    var name: String = ""
    var arrValues = [Category]()

    init(name: String) {
        self.name = name
    }
}

class Category {
    var name: String = ""
    var price : String = ""
    var isSelected: Bool = false
}

и следующие значения: mainArray,

    for i in 0...2 {
        let model = AddOnCategoryModel(name: "Section \(i)")
        for j in 0...3 {
            let cate = Category()
            cate.name = "Category \(j)"
            model.arrValues.append(cate)
        }
        mainArray.append(model)
    }

Теперь, учитывая, что у вас есть следующие ListTableCell

enter image description here

Есть два IBOutlets

@IBOutlet weak var lblTemp: UILabel!
@IBOutlet weak var btnRadio: UIButton!

К вашему сведению.Пожалуйста, установите btnRadio default и selected изображение правильно.

Ваши UITableViewDataSource методы,

func numberOfSections(in tableView: UITableView) -> Int {
    return mainArray.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return mainArray[section].arrValues.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ListTableCell") as! ListTableCell
    let category = mainArray[indexPath.section]
    cell.lblTemp.text = category.arrValues[indexPath.row].name
    cell.btnRadio.tag = indexPath.row
    cell.tag = indexPath.section
    cell.btnRadio.addTarget(self, action: #selector(btnRadioTapped), for: .touchUpInside)
    return cell
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 50
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return mainArray[section].name
}

Пожалуйста, найдите btnRadioTapped метод,

@objc func btnRadioTapped(_ sender: UIButton) {
    sender.isSelected = !sender.isSelected

    let cell = sender.superview?.superview as! ListTableCell

    let addOnModel = mainArray[cell.tag]
    let category = addOnModel.arrValues[sender.tag]
    category.isSelected = sender.isSelected
}

Не давайте проверим, установлены ли все флажки или нет в событии касания кнопки, как это,

@IBAction func btnTapped(_ sender: UIButton) {
    var isCheckedAll = true
    for (_ , item) in mainArray.enumerated() {
        let value = item.arrValues.filter({$0.isSelected==false})
        if value.count > 0 {
            isCheckedAll = false
            break;
        }
    }

    print("Done ", isCheckedAll)
}

Он вернет true, если выбраны все radioButtons, и вернет false, если какой-либо из них radioButton невыбранный.

Сообщите мне в случае каких-либо запросов.Это просто демо, вам нужно внести незначительные изменения в соответствии с вашими окончательными требованиями.

ОБНОВЛЕНИЕ

Пожалуйста, найдите метод didSelectRowAt indexPath ниже,

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let model = mainArray[indexPath.section]
    let category = model.arrValues[indexPath.row]
    category.isSelected = !category.isSelected

    let cell = tableView.cellForRow(at: indexPath) as! ListTableCell
    cell.btnRadio.isSelected = category.isSelected
}
0 голосов
/ 24 мая 2018

По сути, вы должны установить выбранное значение true и false, основываясь на том, что пользователь выбрал строку или отменил выбор строки, а затем просто проверьте, выбран ли какой-либо набор данных, если да, затем сделайте кнопку выделенной / включите, иначе отключите / не выделите

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    selection[indexPath.section].isSelected = true
    tableView.reloadData()
    CheckIfAnyOneIsSelected()
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
   selection[indexPath.section].isSelected = false
   tableView.reloadData()
   CheckIfAnyOneIsSelected()
}

func CheckIfAnyOneIsSelected() {
    //loop through your array and check if anyone is selected if yes break the loop and set the button to enable
    //else make the button disable

   var anyOneSelecte = false
   for singleModel in AddonCategoryModel {
      for item in addonItems {
        if item.isSelected == true 
        anyOneSelecte = true
        break;
      }
   }

   if anyOneSelecte {
      //enable your button 
   } else {
     //disable your button
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...