web-dev-qa-db-ja.com

Swift 3.0すべてのセルを選択する複数選択

テーブルビューにデータを追加し、リストの最初の位置に「すべて選択」オプションを手動で追加しました。ユーザーが「すべて選択」である最初のオプションを選択すると、手動で「すべて選択」オプションが選択されません。 。すべて選択し、クリックしてすべての人を操作するか、選択を解除するか、選択を解除してすべての人に信号を送る「すべて選択」以下のコードを試してみましたが、機能していません。

enter image description here

var unchecked:Bool = true
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            // create a new cell if needed or reuse an old one
            let cell = ObjTableview.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! SelectUserCell
            // set the text from the data model
             cell.selectionStyle = UITableViewCellSelectionStyle.none
            cell.lblStudentName.text = getStudentName[indexPath.row]

            if UnAll == "unselect" {
                if indexPath.row == 0 {
                    cell.btnCheckbox.setImage(UIImage(named: "unSelectedItem"), for: .normal)

                }
                if indexPath.row == Int(selectedNumber) {
                    cell.btnCheckbox.setImage(UIImage(named: "unSelectedItem"), for: .normal)

                }
                if indexPath.row == Int(unSelectNumber) {
                    //var j = "\(i)"

                    cell.btnCheckbox.setImage(UIImage(named: "selectedItem"), for: .normal)

                }

            }else
            {
            if(unchecked){

                cell.btnCheckbox.setImage(UIImage(named: "unSelectedItem"), for: .normal)

            }
            else{

                cell.btnCheckbox.setImage(UIImage(named: "selectedItem"), for: .normal)

              }
            }

            return cell
        }
        var UnAll = ""
        var selectedNumber = ""
        var unSelectNumber = ""
        var checkselect:Bool = true

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

            UnAll.removeAll()
            selectedNumber.removeAll()
            unSelectNumber.removeAll()
            if(indexPath.row == 0){

                btnCheckBoxClick(sender: UIButton())

            }else
            {
            UnAll = "unselect"
                btnCheckBoxClick(sender: UIButton())
                if checkselect {
                    selectedNumber = "\(indexPath.row)"
                    checkselect = false
                }else
                {
                  unSelectNumber = "\(indexPath.row)"
                    checkselect = true
                }

                print("the selected index is : \(indexPath.row)")
            }

        }

        @IBAction func btnCheckBoxClick(_ sender: Any) {   

            if(unchecked){

                unchecked = false
            }
            else{              
                unchecked = true
            }
            ObjTableview.reloadData()
         }
7

Boolプロパティを使用してモデルデータの構造体を作成します。このプロパティはセルの選択によって変更できます。

simulator

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

  var allCharacters:[Character] = []

  override func viewDidLoad() {
    super.viewDidLoad()
        allCharacters = [Character(name: "All"),Character(name: "Luke Skywalker"),Character(name: "Leia Organa"),Character(name: "Advik Shah"),Character(name: "Aarav Modi")]

  }
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return allCharacters.count
  }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
    if cell == nil{
      cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell")
    }
      cell?.textLabel?.text = allCharacters[indexPath.row].name
      if allCharacters[indexPath.row].isSelected
      {
        cell?.accessoryType = .checkmark
      }
      else
      {
        cell?.accessoryType = .none
      }
      cell?.selectionStyle = .none
    return cell!
  }
  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.row == 0
    {
      allCharacters[indexPath.row].isSelected = !allCharacters[indexPath.row].isSelected
      for index in allCharacters.indices
      {
        allCharacters[index].isSelected = allCharacters[indexPath.row].isSelected
      }
    }
    else
    {
      allCharacters[indexPath.row].isSelected = !allCharacters[indexPath.row].isSelected
      if allCharacters.dropFirst().filter({ $0.isSelected }).count == allCharacters.dropFirst().count
      {
        allCharacters[0].isSelected = true
      }
      else
      {
        allCharacters[0].isSelected = false
      }
    }
    tableView.reloadData()
  }




}

struct Character
{
  var name:String
  //  var otherDetails
  var isSelected:Bool! = false
  init(name:String) {
    self.name = name
  }
}

辞書の配列からのStructオブジェクトの配列の作成

let SubjectArray = json["students"] as! [[String:Any]]
allCharacters = SubjectArray.map({ Character(name: $0["studentName"] as! String) })
allCharacters.insert(Character(name:"All"), at: 0)
9
RajeshKumar R

「すべて」の行に別のセクションを使用するという@Pranilの提案が好きなので、私はそれを盗みました。

NSMutableIndexSetを使用して、選択した行を追跡できます。これは、新しい構造体やブール値の配列などを作成するよりも簡単です。知っておく必要がある唯一のことは、テーブルビューで行の並べ替えが許可されている場合、それに応じてインデックスセットを調整する必要があることです。

これが私の実装です。 「すべて」の状態は、選択された行の数がデータソース配列の行の数と等しいことによって決定されます。

チェックマークにシンプルなテーブルビューアクセサリを使用したばかりですが、cellForRow(at:)で画像ベースのアプローチを採用する方法を確認できると思います。

uIKitをインポートする

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableview: UITableView!


    let names: [String]? = ["Luke Skywalker","Leia Organa","Advik Shah","Aarav Modi"]

    var selectedRows = NSMutableIndexSet()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

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

        return 2
    }

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

        guard let names = self.names else {
            return 0
        }

        return 0 == section ? 1 : names.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        var text: String
        var accessory = UITableViewCellAccessoryType.none

        if 0 == indexPath.section {
            text = "All"
            if self.selectedRows.count == self.names!.count {
                accessory = .checkmark
            }
        } else {
            text = names![indexPath.row]
            if selectedRows.contains(indexPath.row) {
                accessory = .checkmark
            }
        }

        cell.textLabel!.text = text
        cell.accessoryType = accessory

        return cell
    }

    func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
        if indexPath.section == 0 {
            if self.selectedRows.count == self.names!.count {
                self.selectedRows = NSMutableIndexSet()
            } else {
                self.selectedRows = NSMutableIndexSet(indexesIn: NSRange(location: 0, length: self.names!.count))
            }
            tableView.reloadData()
        } else {
            self.selectedRows.contains(indexPath.row) ? self.selectedRows.remove(indexPath.row) : self.selectedRows.add(indexPath.row)

            let rows = [IndexPath(row: 0, section: 0), indexPath]

            tableView.reloadRows(at: rows, with: .none)
        }
        return nil
    }
}
4
Paulw11

テーブルビューでセクションを1つだけ使用していると思います。テーブルビューでは2つのセクションを使用することをお勧めします。これにより、最初のセクションには1行のみ(すべて選択)が含まれ、2番目のセクションには他のオプションが含まれます。最初のセクションの最初の行にある[すべて選択]をクリックすると、テーブルビューを再読み込みするときに、2番目のセクションのすべての行が選択された状態になります。

// MARK: -  struct for cell item
    struct CellItem {
    var name : String
    var isSelected:Bool! = false
    init(name: String) {
           self.name = name
         }
    }

class ViewController: UITableViewController {

@IBOutlet var viewTable: UITableView!
// Declare a boolean varaible to toggle the checkbox in the first section of table view
var isSelectAllSelected : Bool = false
var cellData: [CellItem] = []

override func viewDidLoad() {
    super.viewDidLoad()
    cellData = [CellItem(name: "Luke Skywalker"),CellItem(name: "Leia Organa"),CellItem(name: "Advik Shah"),CellItem(name: "Aarav Modi")]
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
         return 1
    }
    else
    {
        return cellData.count
    }
}

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

// MARK: -  Table view delegates

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

}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    let cell = TableCell()
    cell.selectionStyle = .none

    if indexPath.section == 0 {
        cell.textLabel?.text = "Select All"
        if isSelectAllSelected{
            cell.accessoryType = .checkmark
        }
        else{
            cell.accessoryType = .none
        }

    }
    else
    {
        cell.textLabel?.text = cellData[indexPath.row].name
        if cellData[indexPath.row].isSelected{
            cell.accessoryType = .checkmark
        }
        else{
            cell.accessoryType = .none
        }

    }
    return cell
}


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.section == 0
    {
        cellData[indexPath.row].isSelected = !cellData[indexPath.row].isSelected
        isSelectAllSelected = cellData[indexPath.row].isSelected
        for index in cellData.indices
        {
            cellData[index].isSelected = cellData[indexPath.row].isSelected
        }
    }
    else
    {
        cellData[indexPath.row].isSelected = !cellData[indexPath.row].isSelected
        if cellData.filter({ $0.isSelected }).count == cellData.count
        {
            isSelectAllSelected = true
        }
        else
        {
            isSelectAllSelected = false
        }

    }
    viewTable.reloadData()
} }
3
Pranil

こんにちはuは、addtargetメソッドを使用してビューコントローラー内でcheboxbuttonアクションメソッドを取得し、タグindexpath.rowを割り当てることができるため、簡単にindexpathを取得できます。以下のコードからあなたはアイデアを得ることができます。

class ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {

@IBOutlet weak var ObjTableview: UITableView!
var arrStudent = ["1","2","3","4","5"]
var arrSelectedStudent :[Int] = []
var selectAll:Bool = false

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


//MARK: UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arrStudent.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // create a new cell if needed or reuse an old one
    let cell = ObjTableview.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! SelectUserCell
    // set the text from the data model
    cell.selectionStyle = UITableViewCellSelectionStyle.none
   // cell.lblStudentName.text = getStudentName[indexPath.row]
    cell.lblStudentName.text = arrStudent[indexPath.row]
    cell.btnCheckbox.tag = indexPath.row
   cell.btnCheckbox.addTarget(self, action:#selector(btnCheckBoxClick(sender:)), for: .touchUpInside)


    if selectAll {
        cell.btnCheckbox.setImage(UIImage(named: "selectedItem"), for: .normal)
    }else{
    if arrSelectedStudent.contains(indexPath.row){
        cell.btnCheckbox.setImage(UIImage(named: "selectedItem"), for: .normal)
    }else{
        cell.btnCheckbox.setImage(UIImage(named: "unSelectedItem"), for: .normal)
    }
    }

         return cell
}


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

func btnCheckBoxClick(sender: UIButton) {
    if sender.tag == 0{
        selectAll = true
    }else
    {
        selectAll = false
    if let index = arrSelectedStudent.index(of: sender.tag) {
        arrSelectedStudent.remove(at: index)
    }else{
        arrSelectedStudent.append(sender.tag)
    }
    }

    ObjTableview.reloadData()
}}
2
pradip rathod