Проблема с множественным выбором и выберите все в UITableview в Swift - PullRequest
0 голосов
/ 21 мая 2018

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

Если я нажимаю selectAll, он четко проверяет и снимает флажки, и если предположим, чтоЯ выбираю один выбранный элемент, но выбранная ячейка не выделяется.

Можете ли вы помочь мне разобраться.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return self.array.count
}

В cellForRowAtIndexPath,

let cell = self.multipleSelectionTableview.dequeueReusableCell(withIdentifier:multiSelectionIdentifier , for: indexPath) as! MultipleSelectionCell
        if self.selectedRows.contains(indexPath){
            cell.checkBoxBtn.isSelected = true
            cell.checkBoxBtn.setImage(UIImage.init(named: "check"), for: .normal)

        } else {
            cell.checkBoxBtn.isSelected = false
            cell.checkBoxBtn.setImage(UIImage.init(named: "uncheck"), for: .normal)
        }


        if self.multipleSelectionStatusBtn.isSelected == true {
            self.multipleSelectionStatusBtn.isSelected = true
            cell.checkBoxBtn.setImage(UIImage.init(named: "check"), for: .normal)
        } else {
            self.multipleSelectionStatusBtn.isSelected = false
            cell.checkBoxBtn.setImage(UIImage.init(named: "uncheck"), for: .normal)
        }

        cell.checkBoxBtn.tag = indexPath.row
        return cell

В методе выбора флажка,

let selectedIndexPath = IndexPath(row: sender.tag, section: 0)
        self.multipleSelectionTableview.deselectRow(at: selectedIndexPath, animated: true)
        if self.selectedRows.contains(selectedIndexPath)
        {

            self.selectedRows.remove(at: self.selectedRows.index(of: selectedIndexPath)!)
        }
        else
        {

            self.selectedRows.append(selectedIndexPath)
            print(self.selectedRows)

        }

        self.multipleSelectionTableview.reloadData()

В методе selectAll

if (sender.isSelected == true)
        {

            sender.setImage(UIImage(named: "uncheck"), for: .normal)
            sender.isSelected = false;
           // isSelecting = false
            self.selectedRows = self.getAllIndexpaths()
            self.multipleSelectionTableview.reloadData()

        }
        else
        {
           // isSelecting = true
            sender.setImage(UIImage(named: "check"), for: .normal)
            sender.isSelected = true;
            self.selectedRows = self.getAllIndexpaths()
            self.multipleSelectionTableview.reloadData()
        }

Для метода getAllIndexPaths:

func getAllIndexpaths() -> [IndexPath] {
        var indexPaths: [IndexPath] = []
        for j in 0..<self.multipleSelectionTableview.numberOfRows(inSection: 0) {
            indexPaths.append(IndexPath(row: j, section: 0))
        }
        return indexPaths
    }

Ответы [ 3 ]

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

Я запутался с вашей реализацией логики в cellForRowAtIndexpath:

Сначала вы проверяете, содержит ли массив selectedRows выбранный index path или нет, и устанавливаете пользовательский интерфейс checkBoxBtn:

let cell = self.multipleSelectionTableview.dequeueReusableCell(withIdentifier:multiSelectionIdentifier , for: indexPath) as! MultipleSelectionCell
if self.selectedRows.contains(indexPath){
    cell.checkBoxBtn.isSelected = true
    cell.checkBoxBtn.setImage(UIImage.init(named: "check"), for: .normal)

} else {
    cell.checkBoxBtn.isSelected = false
    cell.checkBoxBtn.setImage(UIImage.init(named: "uncheck[enter image description here][1]"), for: .normal)
}

Затем вы снова проверяете multipleSelectionStatusBtn и изменяете пользовательский интерфейс checkBoxBtn:

if self.multipleSelectionStatusBtn.isSelected == true {
    self.multipleSelectionStatusBtn.isSelected = true
    cell.checkBoxBtn.setImage(UIImage.init(named: "check_timesheet"), for: .normal)
} else {
    self.multipleSelectionStatusBtn.isSelected = false
    cell.checkBoxBtn.setImage(UIImage.init(named: "uncheck_timesheet"), for: .normal)
}

cell.checkBoxBtn.tag = indexPath.row
return cell

Когда tableView перезагрузится, очевидно, это будет работать в множественном выборе, а не в одиночном выборе.

Изменение

В selectAll Метод:

if (sender.isSelected == true)
{

    sender.setImage(UIImage(named: "uncheck"), for: .normal)
    sender.isSelected = false;
   // isSelecting = false
    self.selectedRows.removeAll()
    self.multipleSelectionTableview.reloadData()

}
else
{
   // isSelecting = true
    sender.setImage(UIImage(named: "check"), for: .normal)
    sender.isSelected = true;
    self.selectedRows = self.getAllIndexpaths()
    self.multipleSelectionTableview.reloadData()
}

В cellForRowAtIndexPath:

let cell = self.multipleSelectionTableview.dequeueReusableCell(withIdentifier:multiSelectionIdentifier , for: indexPath) as! MultipleSelectionCell
if self.selectedRows.contains(indexPath){
    cell.checkBoxBtn.isSelected = true
    cell.checkBoxBtn.setImage(UIImage.init(named: "check"), for: .normal)

} else {
    cell.checkBoxBtn.isSelected = false
    cell.checkBoxBtn.setImage(UIImage.init(named: "uncheck[enter image description here][1]"), for: .normal)
}
if getTimeSheetJSON[indexPath.row]["TaskName"].string == "" {
    cell.checkBoxBtn.isHidden = true
} else {
    cell.checkBoxBtn.isHidden = false
}

cell.checkBoxBtn.tag = indexPath.row
return cell

Надеждаэто работает, так как я не скомпилировал ваш код в Xcode.

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

Вы должны сохранить выбранный индексный путь в массиве. Таким образом, вы можете сделать это легко.

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var selectedRow:[IndexPath] = []
@IBOutlet var tblView:UITableView!

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section:
    Int) -> Int
{
    return 100
}
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 = String(format:"%@",indexPath.row)

    if selectedRow.contains(indexPath)
    {
        cell?.accessoryType = .checkmark
    }
    else
    {
        cell?.accessoryType = .none
    }        
    return cell!
}
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    if selectedRow.contains(indexPath)
    {
        // For  Remove Row selection
        selectedRow.remove(at: selectedRow.index(of: indexPath)!)
    }
    else
    {
        selectedRow.append(indexPath)
    }

    tableView.reloadData()
}

// Call this method for Select All
func selectAllCall()
{
    var indexPaths: [IndexPath] = []
    for j in 0..<100
    {
        indexPaths.append(IndexPath(row: j, section: 0))
    }

    selectedRow.removeAll()

    selectedRow.append(contentsOf: indexPaths)

    tblView.reloadData()
}
}
0 голосов
/ 21 мая 2018

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

Решение.

Необходимо отслеживать выбранные пути индекса.И в cellForRowAt: вам нужно проверить, что если это проверенный путь индекса, вам нужно выделить ячейку, изменив цвет фона, иначе установите цвет фона ячейки белым или что-то еще.

Например,

//In cellForRowAtIndexPath

 if arrSelectedIndexPath.contains(indexPath) {
     // checkbox is checked, change cell bg color
 } else {
    // checkbox is not checked
 }

arrSelectedIndexPath - это [IndexPath] массив путей индекса.Когда флажок установлен, вам нужно вставить путь индекса в массив, а когда флажок снят, вам нужно удалить этот путь индекса из массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...