swift 3.0 множественный выбор с выбором всей ячейки

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

введите описание изображения здесь

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

4 Solutions collect form web for “swift 3.0 множественный выбор с выбором всей ячейки”

Создайте структуру данных модели с использованием свойства Bool. Вы можете изменить это свойство на выбор ячейки.

имитатор

 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) 

Я думаю, что вы используете только один раздел в представлении таблицы. Я предлагаю вам использовать два раздела в представлении таблицы, так что первый раздел будет содержать только одну строку (Выбрать все), а вторая часть будет содержать другие параметры. Когда вы нажимаете «Выбрать все», то есть в первой строке первого раздела, вы можете сделать все строки во втором разделе выбранными при повторной загрузке представления таблицы.

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

Здравствуйте, u может принять метод действия cheboxbutton внутри контроллера представления с помощью метода addtarget и назначить тег indexpath.row, так что вы можете легко получить индексный путь. из ниже кода вы можете получить эту идею.

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

Мне нравится предложение Пранила использовать отдельный раздел для строки «Все», поэтому я украл это.

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

Вот моя реализация. Состояние «все» определяется количеством выбранных строк, равным количеству строк в массиве источников данных.

Я просто использовал простые аксессуары для настольных cellForRow(at:) , но я уверен, что вы можете увидеть, как принять свой подход на основе изображения в 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 } } 
  • Загрузка UIImageView в UITableViewCell Accessory View
  • iOS-имитирующая таблица по умолчанию tableView
  • Как заставить json заполнять UITableView в Swift 3?
  • Замените существующую пользовательскую ячейку A другой пользовательской ячейкой B в стиле аккордеона - по выбору
  • Как перетащить статическую ячейку в таблицуView swift?
  • Swift: UIButton в пользовательской UITableViewCell «Непризнанный селектор, отправленный в экземпляр»
  • UITableView загружает одинаковые изображения при прокрутке (Parse.com SDK)
  • Xcode 6 Добавление таблицыHeaderView в IB
  • Почему мой UITableViewCell не отменяет выбор и не обновляет его текст?
  • Как узнать, сколько видится UITableViewCell
  • Как добавить UIRefreshControl на нижнем уровне UITableView?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.