Pergunta

Para o iPhone, é possível configurar um UITableView tal que permitirá seleção múltipla?

Eu tentei substituir -setSelected:animated: para cada UITableViewCell, mas tentar falsificar o comportamento exigido é complicado, pois é difícil separar os unselections reais daqueles onde o UITableView pensa que eu desmarcada devido a selecção de outra célula!

Espero que alguém pode ajudar!

Obrigado,

Nick.

Foi útil?

Solução

A melhor maneira de fazer isso seria a de uma marca de verificação por linha selecionada.

Você pode fazer isso definindo o accessoryType nos casos UITableViewCell selecionados para UITableViewCelAccessoryCheckmark.

Para desmarcar a linha, configurá-lo de volta para UITableViewCellAccessoryNone.

Para enumerar quais células / linhas foram selecionados (por exemplo, ao clicar em um botão), simplesmente iterar sobre as células da tabela procurando UITableViewCellAccessoryCheckmark. Ou, gerenciar algumas NSSet ou similar em sua tabela vista delegado no "se selecionar" métodos de delegado.

Outras dicas

Na sequência de propriedade deve funcionar bem se você estiver desenvolvendo aplicativos para iOS5.0 +

self.tableView.allowsMultipleSelection = YES;

Use o código a seguir para configurar os tipos de acessórios célula:

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

Jeff Lamarche tem um tutorial sobre como fazer isso aqui:

http: //iphonedevelopment.blogspot. COM / 2008/10 / mesa-view-multi-row-edit-mode.html

Eu não tentei o código, mas tem sido na parte de trás da minha mente por um tempo, sabendo que o dia virá quando eu precisar dele.

Eu backported allowsMultipleSelectionDuringEditing e allowsMultipleSelection de iOS5 para iOS mais antigos. Você pode bifurcar-lo em https://github.com/ud7/UDTableView-allowsMultipleSelection

É de queda na substituição e única coisa que você precisa fazer é a mudança UITableView para UDTableView (no código ou construtor de interface)

A partir da HIG:

vista Mesa fornecer feedback quando os usuários selecionam os itens da lista. Especificamente, quando um artigo pode ser seleccionado, o linha que contém o item de destaques, brevemente, quando um utilizador selecciona para mostrar que a selecção tenha sido recebida. Em seguida, uma ação imediata ocorre: ou uma nova visão é revelada ou a linha exibe uma marca de verificação para indicar que o item foi selecionado. A fila não permanece realçado, porque vistas tabela não exibir um estado seleccionado persistente.

Você vai precisar rolar o seu próprio estilo de seleção múltipla, ou com algo como Mail, ou usando o acessório de marca em suas células.

Caras para seleção múltipla você só precisa

self.tableView.allowsMultipleSelection = YES;

em viewDidLoad e

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

Se você está tentando fazer algo como do correio de múltipla escolha (para o correio de exclusão, por exemplo), então você provavelmente vai ter de gerir toda a seleção si mesmo. seleção de linha múltipla não é algo que é padrão no iPhone. resolve-mail isso usando marcas de seleção para indicar quais linhas foram selecionados.

blue linha destacada como um indicador de se uma linha é selecionada é realmente desanimado acordo com o HIG página 121. Checkmarks irá fazer o truque.

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

}

, em seguida, adicionar o seu arraying ou como quer que você deseja armazenar os dados dos quais foram selecionados.

Eu estava procurando a mesma questão ea resposta de Bhavin Chitroda sovled-lo para mim, mas com alguma além de manter a marca de verificação como era durante a rolagem.

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

}

A adição:

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

    return cell;

}

Nota: isso não funciona no iOS 4+. Esta é uma constante privada, sem documentos. Não usá-lo.

Se você não está planejando para enviar seu aplicativo para a App Store, você pode invocar o modo de edição multi-linha com a implementação do método a seguir em sua delegado UITableViewController:

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

Testado com 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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top