Можно ли настроить UITableView, чтобы разрешить множественный выбор? - PullRequest
41 голосов
/ 21 ноября 2008

Для iPhone, возможно ли настроить UITableView таким образом, чтобы он позволял множественный выбор?

Я попытался переопределить -setSelected:animated: для каждого UITableViewCell, но попытка выдумать требуемое поведение довольно сложно, поскольку трудно отделить реальные невыбранные варианты от тех, где UITableView считает, что я не выбран из-за выбора другой ячейки!

Надеюсь, кто-то может помочь!

Спасибо

Ник.

Ответы [ 12 ]

39 голосов
/ 02 апреля 2012

Следующее свойство должно работать нормально, если вы разрабатываете приложение для iOS5.0 +

self.tableView.allowsMultipleSelection = YES;
37 голосов
/ 21 ноября 2008

Лучший способ сделать это - поставить галочку на выбранной строке.

Это можно сделать, установив accessoryType для выбранных экземпляров UITableViewCell в UITableViewCelAccessoryCheckmark.

Чтобы отменить выбор строки, установите для нее значение UITableViewCellAccessoryNone.

Чтобы перечислить, какие ячейки / строки были выбраны (скажем, после нажатия кнопки), просто переберите ячейки таблицы в поисках UITableViewCellAccessoryCheckmark. Или управляйте каким-нибудь NSSet или подобным в вашем делегате табличного представления в методах делегата «действительно выбрал».

25 голосов
/ 23 марта 2009

Используйте следующий код для настройки типов аксессуаров для ячеек:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];


    if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
        thisCell.accessoryType = UITableViewCellAccessoryCheckmark;

    }else{
        thisCell.accessoryType = UITableViewCellAccessoryNone;

    }
}

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {

//add your own code to set the cell accesory type.
return UITableViewCellAccessoryNone;
}
24 голосов
/ 24 марта 2009

У Джеффа Ламарша есть учебник о том, как это сделать, здесь:

http://iphonedevelopment.blogspot.com/2008/10/table-view-multi-row-edit-mode.html

Я не пробовал код, но некоторое время он был у меня в голове, зная, что придет день, когда он мне понадобится.

11 голосов
/ 04 декабря 2011

Я перенес allowsMultipleSelectionDuringEditing и allowsMultipleSelection с iOS5 на более старую iOS. Вы можете раскошелиться на https://github.com/ud7/UDTableView-allowsMultipleSelection

Это замена замены, и единственное, что вам нужно сделать, это изменить UITableView на UDTableView (в конструкторе кода или интерфейса)

5 голосов
/ 12 декабря 2012

Ребята для множественного выбора, вам просто нужно

self.tableView.allowsMultipleSelection = YES;

на viewDidLoad и

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = NO; 
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = YES;
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryNone;
}
5 голосов
/ 21 ноября 2008

С HIG:

Представления таблиц обеспечивают обратную связь, когда пользователи выбирают элементы списка. В частности, когда элемент может быть выбран, строка, содержащая элемент, кратко выделяется, когда пользователь выбирает его, чтобы показать, что выбор был получен. Затем происходит немедленное действие: либо открывается новое представление, либо в строке отображается галочка для указания что предмет был выбран. Строка никогда не остается выделенной, потому что в табличных представлениях не отображается постоянное выбранное состояние.

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

2 голосов
/ 16 января 2013

Я искал ту же самую проблему, и ответ Бхавина Читрода решил ее для меня, но с некоторым дополнением, чтобы оставить галочку, как это было при прокрутке.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        if ( [array indexOfObject:indexPath] == NSNotFound ) {
            [array addObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            [array removeObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }

}

Дополнение:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// Your code here
.
.
.
    if ( [array indexOfObject:indexPath] == NSNotFound ) {
        cell.accessoryType = UITableViewCellAccessoryNone;
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    return cell;

}
2 голосов
/ 29 февраля 2012

выделенная синим строка как индикатор того, выбрана ли строка, на самом деле не рекомендуется в соответствии с HIG стр. 121. Галочки помогут.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    int selectedRow = indexPath.row;
    cout << "selected Row: " << selectedRow << endl;
    UITableViewCell *indexPathForCell = [tableView cellForRowAtIndexPath:indexPath];
    if (indexPathForCell.accessoryType == UITableViewCellAccessoryNone) {
        indexPathForCell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        indexPathForCell.accessoryType = UITableViewCellAccessoryNone;
    }

}

затем добавьте массив или как вы хотите сохранить данные, которые были выбраны.

2 голосов
/ 21 ноября 2008

Если вы пытаетесь сделать что-то вроде множественного выбора Mail (например, для удаления почты), то вам, вероятно, придется самостоятельно управлять всем выбором. Выбор нескольких строк не является стандартом для iPhone. Почта решает эту проблему, используя галочки, чтобы указать, какие строки были выбраны.

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