UITableView每个部分的选定行(多项选择)

时间:2018-09-04 09:08:00

标签: ios swift uitableview

我使用过tableview(分组)。

所以我需要从UITableviewSection的每个部分中选择一行。

因此,我有tableview和一个提交按钮。因此,我需要检查何时单击“提交”按钮,我需要检查我是否从每个部分中选择了一行,如果没有,则显示未选中的警报部分编号。如何检查?

这是我的数据。

{
    "data":[
              {
               "question": "Gender",
               "options": ["Male","Female"]
              },
              {
               "question": "How old are you",
               "options": ["Under 18","Age 18 to 24","Age 25 to 40","Age 41 to 60","Above 60"]
              },
              {
               "question": "I am filling the Questionnaire for?",
               "options": ["Myself","Mychild","Partner","Others"]
              }
            ]


}

QuestionModel:-

class QuestionListModel: NSObject {
     var selected = false

    var dataListArray33:[NH_OptionsModel] = []


    var id:Int!
    var question:String!
    var buttontype:String!
    var options:[String]?
    var v:String?

      var optionsModelArray:[OptionsModel] = []
    init(dictionary :JSONDictionary) {

        guard   let question = dictionary["question"] as? String,
            let typebutton = dictionary["button_type"] as? String,

                let id = dictionary["id"] as? Int
             else {
                return

        }



        if let options = dictionary["options"] as? [String]{
            print(options)

           print(options)


            for values in options{

                print(values)

                let optionmodel = OptionsModel(values: values)
                self.optionsModelArray.append(optionmodel)

            }


        }


        self.buttontype = typebutton
        self.question = question
        self.id = id
    //   print(self.dataListArray33)
                   }

}

optionModel:-

class OptionsModel: NSObject {

    var isSelected:Bool? = false

  var v:String?
        var values:String?



     init(values:String) {

           self.values = values
           print( self.values)

        }

ViewModel:-

     func numberOfSections(tableView: UITableView) -> Int{
            print((datasourceModel.dataListArray?.count)!)
            return (datasourceModel.dataListArray?.count)!
        }

        func titleForHeaderInSection(atsection section: Int) -> NH_QuestionListModel {
            return datasourceModel.dataListArray![section]
        }

        func numberOfRowsIn(section:Int) -> Int {

            print( datasourceModel.dataListArray?[section].optionsModelArray.count ?? 0)
            return datasourceModel.dataListArray?[section].optionsModelArray.count ?? 0
            // return self.questionsModelArray?[section].optionsModelArray.count ?? 0
        }

        func datafordisplay(atindex indexPath: IndexPath) -> NH_OptionsModel{

            print(datasourceModel.dataListArray![indexPath.section].optionsModelArray[indexPath.row])

            return datasourceModel.dataListArray![indexPath.section].optionsModelArray[indexPath.row]

        }
 func question(answer:String)  {
        print(questions)
        questions.append(answer)
        print(questions )



    }

    func questionlist(answer:String)  {
        print( questionlist )
        questionlist.append(answer)
        print( questionlist )



    }
    func answer(answer:String)  {
      answers.append(answer)
               print(answers)



    }

最后是viewController:-

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


    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {


        let identifier = "HeaderCell"

        var headercell: questionheader! = tableView.dequeueReusableCell(withIdentifier: identifier) as? questionheader

        if headercell == nil {
            tableView.register(UINib(nibName: "questionheader", bundle: nil), forCellReuseIdentifier: identifier)
            headercell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_questionheader
        }

        headercell.setReviewData(reviews:questionViewModel.titleForHeaderInSection(atsection:section))




        return headercell
    }



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

        return 150

    }



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return questionViewModel.numberOfRowsIn(section: section)
    }


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


        let identifier = "Cell"
        var cell: QuestionListCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? QuestionListCell

        if cell == nil {
            tableView.register(UINib(nibName: "QuestionListCell", bundle: nil), forCellReuseIdentifier: identifier)
            cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
        }
        cell.contentView.backgroundColor = UIColor.clear


        let questionsModel = questionViewModel.titleForHeaderInSection(atsection:indexPath.section)
        print(questionsModel.buttontype)

        questionViewModel.button = questionsModel.buttontype


        cell.setOptions(Options1: questionViewModel.datafordisplay(atindex: indexPath))

         print("Section \(indexPath.section), Row : \(indexPath.row)")


        return cell

    }





    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){


        print("Section \(indexPath.section), Row : \(indexPath.row)")


        let cell = tableview.cellForRow(at: indexPath) as? NH_QuestionListCell

        let model = questionViewModel.datafordisplay(atindex: indexPath)

        print(model.isSelected)


        cell?.setOptions(OptionsSelected:questionViewModel.datafordisplay(atindex: indexPath))
        print(model.isSelected)
        questionViewModel.isselected = model.isSelected!



        let section = indexPath.section
        let index = indexPath.row
        print(section)
        print(index)



        if !questionViewModel.selectedIndexPaths.contains(indexPath) {

            questionViewModel.selectedIndexPaths.append(indexPath)
            print(questionViewModel.selectedIndexPaths.append(indexPath))


            let questionModel = questionViewModel.titleForHeaderInSection(atsection: section)
            print(questionModel.question)


            questionViewModel.question = questionModel.question
            questionViewModel.questionlist(answer: questionViewModel.question!)


            let cell = tableview.cellForRow(at: indexPath) as? NH_QuestionListCell

            let model = questionViewModel.datafordisplay(atindex: indexPath)
            print(model.values)

            questionViewModel.answer(answer: model.values!)

            let value: Int = questionModel.id
                let string = String(describing: value)
                //let x: Int? = Int(model.id)

            questionViewModel.question_id = string
            questionViewModel.question(answer: questionViewModel.question_id!)

            print(questionModel.id)

            // append the selected index paths
        }       //  if indexPath.section == section {
       //     questionViewModel.indexPath(indexPaths: index)
       // }


            }

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {




        if let index = questionViewModel.selectedIndexPaths.index(of: indexPath) {
            print(index)
            questionViewModel.selectedIndexPaths.remove(at: index)
        }



}

据此,我得到了输出。 但是我在viewcontroller中有按钮动作。

@IBAction func forward(_ sender: AnyObject) {
}

在此按钮操作中,我需要检查是否从每个部分中选择了一行。如果未显示警告,该怎么办

我当前的didselect方法:-

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
 let cell = tableview.cellForRow(at: indexPath) as? NH_QuestionListCell

            let model = questionViewModel.datafordisplay(atindex: indexPath)

            print(model.isSelected)


            cell?.setOptions(OptionsSelected:questionViewModel.datafordisplay(atindex: indexPath))
            print(model.isSelected)
            questionViewModel.isselected = model.isSelected!



            let section = indexPath.section
            let index = indexPath.row
            print(section)
            print(index)


            if !questionViewModel.selectedIndexPaths.contains(indexPath) {

                questionViewModel.selectedIndexPaths.append(indexPath)
                print(questionViewModel.selectedIndexPaths.append(indexPath))


                let questionModel = questionViewModel.titleForHeaderInSection(atsection: section)
                print(questionModel.question)


                questionViewModel.question = questionModel.question
                questionViewModel.questionlist(answer: questionViewModel.question!)


                let cell = tableview.cellForRow(at: indexPath) as? NH_QuestionListCell

                let model = questionViewModel.datafordisplay(atindex: indexPath)
                print(model.values)

                questionViewModel.answer(answer: model.values!)

                let value: Int = questionModel.id
                    let string = String(describing: value)
                    //let x: Int? = Int(model.id)

                questionViewModel.question_id = string
                questionViewModel.question(answer: questionViewModel.question_id!)

                print(questionModel.id)

                          }

我有3个数组 根据此didselect方法:-

ex:-对于第1部分:-i选择了第一行,因此数据如下追加。

questionlist:["How r u?"]
answelist:["fine"]

但是假设我认为我需要第二个indexpath,那么我需要从数组中删除之前添加的数据并添加当前数据。如下所示:

questionlist:["How r u?"]
answelist:["not well"]

接下来是第2部分:我选择了第一个indexpath.row数据。然后追加了数据。所以我需要获得以下内容:-

 questionlist:["How r u?","Gender"]
    answelist:["not well","Male"]

这里选择我认为我需要第二个选项,然后从数组中删除添加的indexpath.row数据,并显示为:-

 questionlist:["How r u?","Gender"]
        answelist:["not well","Female"]

这样设置如何?

4 个答案:

答案 0 :(得分:0)

您可以将选定的indexPath存储在数组中。提交的OnClick只是遍历数组,并检查每个部分中至少有一个元素。

仅供参考:indexPath也包含节信息。

声明一个可变数组并在viewDidLoad中分配。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        [anArray addObject:indexPath];

}

在“提交”操作之后,您可以根据自己的要求即兴进行

-(void)onSubmitAction{
     [anArray addObject:indexPath];
     NSMutableArray *countOfSection=[[NSMutableArray alloc]init];
    for (NSIndexPath*indexPath in anArray ) {
      if(![anArray containsObject:indexPath.section])
        [countOfSection addObject:indexPath.section];
      }
      if(countOfSection.count == self.tableview.numberOfSections){
    //write your code
      }else{
    // show alert
   }

  }

答案 1 :(得分:0)

您可以根据

之类的选择来更新模型
"data":[
              {
              "question": "Gender",
              "options": ["Male","Female"],
              "optionSelected": "Male"

              }
              ]

然后在提交时,检查数据以进行选择

答案 2 :(得分:0)

表视图具有获取选定索引路径的属性。您可以为此使用所有本机组件。您需要在索引路径中取消选择某个项目,而该项目在某个部分中已经被选中。然后,您只需要检查所选索引路径的数量是否与数据源中的数组数量相同即可。

检查以下内容:

var dataSource: [[Any]]!
var tableView: UITableView!

func didSelectRowAt(_ indexPath: IndexPath) {
    guard let selectedPaths = tableView.indexPathsForSelectedRows else { return } // We need to have selected paths
    guard selectedPaths.contains(indexPath) == false else { return } // The same cell being selected

    let previouslySelectedCellIndexPaths: [IndexPath] = selectedPaths.filter { $0.section == indexPath.section && $0 != indexPath } // Getting all selected index paths within this section
    previouslySelectedCellIndexPaths.forEach { tableView.deselectRow(at: $0, animated: true) } // Deselect waht was previously selected
}

/// Will return array of selected objects only if all sections have a selected index
///
/// - Returns: A result array
func getSelectionData() -> [Any]? {
    guard let selectedPaths = tableView.indexPathsForSelectedRows else { return nil } // We need to have selected paths
    guard selectedPaths.count == dataSource.count else { return nil } // This should prevent missing selections assuming all index paths are unique in sections
    return selectedPaths.map { dataSource[$0.section][$0.row] } // Map selected index paths back to objects
}

我尝试使用一种最少的代码来显示所有这些内容。全部注释,因此您可以逐行查看发生了什么。

您可能想检查第二种方法中所有部分都是唯一的,但是如果始终使用第一种方法则不需要。

答案 3 :(得分:0)

第1步:创建全局变量

var selectedIndexPaths = [IndexPath]() 

第2步:添加UITableView属性

tableView.allowsMultipleSelection = true

第3步:实现委托方法

//On Selection
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)      {


        let selectedIndexPathAtCurrentSection = selectedIndexPaths.filter({ $0.section == indexPath.section})

        for indexPath in selectedIndexPathAtCurrentSection {
            tableView.deselectRow(at: indexPath, animated: true)
            if let indexOf = selectedIndexPaths.index(of: indexPath) {
                selectedIndexPaths.remove(at: indexOf)
            }
        }
        selectedIndexPaths.append(indexPath)


}
// On DeSelection
 func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {

    if let index = selectedIndexPaths.index(of: indexPath) {
        selectedIndexPaths.remove(at: index)
    }
}

第4步:获取带有各节的选定IndexPaths

@IBAction func forward(sender:Any){

      let totalSections = questionViewModel.numberOfSections(tableView: tableView)


       for section in 0..<totalSections {

        if (selectedIndexPaths.filter({ $0.section == section}).count >= 1) {
            continue
        } else {

            // Show alert
            print("Please select item at",(section))
            return
        }
    }

}