Можно ли настроить UITableView, чтобы разрешить множественный выбор?

StackOverflow https://stackoverflow.com/questions/308081

Вопрос

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

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

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

Спасибо,

Ник.

Это было полезно?

Решение

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

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

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

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

Другие советы

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

self.tableView.allowsMultipleSelection = YES;

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

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

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

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

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

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

Это замена, и единственное, что вам нужно сделать, это изменить UITableView на UDTableView (в code или interface builder)

От самого ВЫСОКОГО:

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

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

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

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

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

строка, выделенная синим цветом в качестве индикатора того, выбрана ли строка, на самом деле не рекомендуется в соответствии с ПРИВЕТ страница 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;
    }

}

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

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

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

}

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

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

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

Протестировано с 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top