Выберите несколько ячеек в UITableview [duplicate]

Вот полное решение в Java для создания подготовленного оператора для вас:

/*usage:

Util u = new Util(500); //500 items per bracket. 
String sqlBefore  = "select * from myTable where (";
List<Integer> values = new ArrayList<Integer>(Arrays.asList(1,2,4,5)); 
string sqlAfter = ") and foo = 'bar'"; 

PreparedStatement ps = u.prepareStatements(sqlBefore, values, sqlAfter, connection, "someId");
*/



import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Util {

    private int numValuesInClause;

    public Util(int numValuesInClause) {
        super();
        this.numValuesInClause = numValuesInClause;
    }

    public int getNumValuesInClause() {
        return numValuesInClause;
    }

    public void setNumValuesInClause(int numValuesInClause) {
        this.numValuesInClause = numValuesInClause;
    }

    /** Split a given list into a list of lists for the given size of numValuesInClause*/
    public List<List<Integer>> splitList(
            List<Integer> values) {


        List<List<Integer>> newList = new ArrayList<List<Integer>>(); 
        while (values.size() > numValuesInClause) {
            List<Integer> sublist = values.subList(0,numValuesInClause);
            List<Integer> values2 = values.subList(numValuesInClause, values.size());   
            values = values2; 

            newList.add( sublist);
        }
        newList.add(values);

        return newList;
    }

    /**
     * Generates a series of split out in clause statements. 
     * @param sqlBefore ""select * from dual where ("
     * @param values [1,2,3,4,5,6,7,8,9,10]
     * @param "sqlAfter ) and id = 5"
     * @return "select * from dual where (id in (1,2,3) or id in (4,5,6) or id in (7,8,9) or id in (10)"
     */
    public String genInClauseSql(String sqlBefore, List<Integer> values,
            String sqlAfter, String identifier) 
    {
        List<List<Integer>> newLists = splitList(values);
        String stmt = sqlBefore;

        /* now generate the in clause for each list */
        int j = 0; /* keep track of list:newLists index */
        for (List<Integer> list : newLists) {
            stmt = stmt + identifier +" in (";
            StringBuilder innerBuilder = new StringBuilder();

            for (int i = 0; i < list.size(); i++) {
                innerBuilder.append("?,");
            }



            String inClause = innerBuilder.deleteCharAt(
                    innerBuilder.length() - 1).toString();

            stmt = stmt + inClause;
            stmt = stmt + ")";


            if (++j < newLists.size()) {
                stmt = stmt + " OR ";
            }

        }

        stmt = stmt + sqlAfter;
        return stmt;
    }

    /**
     * Method to convert your SQL and a list of ID into a safe prepared
     * statements
     * 
     * @throws SQLException
     */
    public PreparedStatement prepareStatements(String sqlBefore,
            ArrayList<Integer> values, String sqlAfter, Connection c, String identifier)
            throws SQLException {

        /* First split our potentially big list into lots of lists */
        String stmt = genInClauseSql(sqlBefore, values, sqlAfter, identifier);
        PreparedStatement ps = c.prepareStatement(stmt);

        int i = 1;
        for (int val : values)
        {

            ps.setInt(i++, val);

        }
        return ps;

    }

}
20
задан tefter 28 May 2015 в 20:34
поделиться

5 ответов

Прежде всего, перейдите на свою раскадровку и выберите «TableView», а в «Attributes Inspector» установите «Selection to Multiple Selection».

Инспектор атрибутов с множественным выбором

Затем переопределите функцию setSelected (_ selected: Bool, animated: Bool) в подклассе UITableViewCell.

override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        accessoryType = selected ? UITableViewCellAccessoryType.checkmark : UITableViewCellAccessoryType.none
    }
6
ответ дан Aatish Rajkarnikar 17 August 2018 в 13:31
поделиться

Swift 4

Просто подкласс UITableViewCell выглядит следующим образом:

class CheckableTableViewCell: UITableViewCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = .none
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        self.accessoryType = selected ? .checkmark : .none
    }
}

Затем используйте его в своем cellForRowAt indexPath как таковом:

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", 
    for: indexPath) as? CheckableTableViewCell

Если вы должны, не забудьте подклассифицировать свою ячейку прототипа в вашей xib / раскадровке:

59
ответ дан Alexandre G. 17 August 2018 в 13:31
поделиться
  • 1
    Этот способ очень полезен, пожалуйста, скажите мне, как я могу получить индекс выбранных ячеек в представлении таблицы или лучше вести меня, если у меня есть массив более подробной информации о ячейках, как я могу получить массив информации из выбранных ячеек не всех их – Saeed Rahmatolahi 16 July 2017 в 11:28
  • 2
    К сожалению, при прокрутке таблицыView свойство isSelected выбранной ячейки, похоже, теряется при использовании многоразовых ячеек таблицы. Таким образом, вы можете выбрать несколько ячеек, получить галочку, прокрутить вниз в таблицеView, прокручивать вверх, и ячейки снова будут сняты. Есть идеи? – Alienbash 5 March 2018 в 17:47
  • 3
    Вы правы @ Alienbash, я изменил свой ответ соответственно. – Alexandre G. 5 March 2018 в 21:30
  • 4
  • 5
    – Alexandre G. 26 September 2018 в 14:09

Есть много решений этой проблемы, вот что я придумал. Я использую встроенную ячейку «selected», поэтому tableview сохраняет ее для нас. Просто убедитесь, что в вашем раскадровке или при настройке таблицы в коде вы используете несколько вариантов.

import UIKit

class TableViewController: UITableViewController
{
    var lastSelectedIndexPath = NSIndexPath(forRow: -1, inSection: 0)

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! UITableViewCell

        // Configure the cell...
        cell.textLabel!.text = "row: \(indexPath.row)"

        if cell.selected
        {
            cell.accessoryType = UITableViewCellAccessoryType.Checkmark
        }
        else
        {
            cell.accessoryType = UITableViewCellAccessoryType.None
        }

        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        let cell = tableView.cellForRowAtIndexPath(indexPath)

        if cell!.selected == true
        {
            cell!.accessoryType = UITableViewCellAccessoryType.Checkmark
        }
        else
        {
            cell!.accessoryType = UITableViewCellAccessoryType.None
        }
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 100
    }
}

Я сделал здесь пример проекта: https://github.com/brcimo/SwiftTableViewMultipleSelection

2
ответ дан Bryan Cimo 17 August 2018 в 13:31
поделиться
  • 1
    Кажется, это не работает. tableView:didSelectRowAtIndexPath: вызывается только при выборе строки, а не при отмене выбора, поэтому cell.selected всегда будет правдой! – entropid 11 November 2015 в 01:41

Это отключить.

class TableViewController: UITableViewController
{
    var lastSelectedIndexPath = NSIndexPath(forRow: -1, inSection: 0)

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) 

        // Configure the cell...
        cell.textLabel!.text = "row: \(indexPath.row)"

        if cell.selected
        {
            cell.selected = false
            if cell.accessoryType == UITableViewCellAccessoryType.None
            {
                cell.accessoryType = UITableViewCellAccessoryType.Checkmark
            }
            else
            {
                cell.accessoryType = UITableViewCellAccessoryType.None
            }
        }

        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        let cell = tableView.cellForRowAtIndexPath(indexPath)

        if cell!.selected
        {
            cell!.selected = false
            if cell!.accessoryType == UITableViewCellAccessoryType.None
            {
                cell!.accessoryType = UITableViewCellAccessoryType.Checkmark
            }
            else
            {
                cell!.accessoryType = UITableViewCellAccessoryType.None
            }
        }
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 100
    }
}
6
ответ дан MichaelS 17 August 2018 в 13:31
поделиться

вам нужно создать класс костюма, чтобы получить выбранное состояние ячейки, где вы должны переопределить func, называемый setSelected (_ selected: Bool, animated: Bool), или галочка будет отображаться случайным образом по мере прокрутки ... здесь является примером того, что я сделал: 1 - создал класс для ячейки 2 - добавил выход для изображения, чтобы отобразить галочку (вы можете избежать этого, если вы не хотите изображения с типом костюма) 3- переопределили функцию и используется выбранный параметр: D

здесь мой класс:

import UIKit

класс AddLocationCell: UITableViewCell {

@IBOutlet weak var check: UIImageView!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    if selected{
        check.image = UIImage(named:"check_active")
    }else{
        check.image = UIImage(named:"check_normal")

    }
    // Configure the view for the selected state
}

}

2
ответ дан mohammad alnajjar 17 August 2018 в 13:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: