Можно ли настроить UITableView для разрешения множественного выбора?

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

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

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

Спасибо,

Ник.

Ответ 1

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

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

Чтобы отменить выбор строки, верните ее в UITableViewCellAccessoryNone.

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

Ответ 2

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

self.tableView.allowsMultipleSelection = YES;

Ответ 3

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

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

Ответ 5

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

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

Ответ 6

Из HIG:

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

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

Ответ 7

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

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;
}

Ответ 8

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

Ответ 9

Синяя подсвеченная строка как индикатор того, выбрана ли строка, фактически обескуражена в соответствии с 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;
    }

}

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

Ответ 10

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

- (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;

}

Ответ 11

Примечание. Это не работает в iOS 4+. Это частная, недокументированная константа. Не используйте его.

Если вы не планируете отправлять свое приложение в App Store, вы можете вызвать многострочный режим редактирования, выполнив следующий метод в вашем делете UITableViewController:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 3; // Undocumented constant
}

Ответ 12

Протестировано с iOS4.3 - 6.0

-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {

    if ([controller.searchResultsTableView respondsToSelector:@selector(allowsMultipleSelectionDuringEditing)]) {
        controller.searchResultsTableView.allowsMultipleSelectionDuringEditing = YES;
    }
    else {
        controller.searchResultsTableView.allowsSelectionDuringEditing = YES;
    }
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellAccessoryCheckmark;
}