Mudança - Projeto Little Incrível
- Joel Levin
Esta é uma tentativa de implementar a solução descrita no artigo de Dave DeLong, editar a distância e editar etapas.
Uma Changeset descreve as edições mínimas necessárias para passar de uma Collection de elementos Equatable para outro.
Foi escrito principalmente para ser usado em conjunto com as fontes de dados UITableView e UICollectionView , detectando adições, exclusões, substituições e movimentos entre os dois conjuntos de dados. Mas também pode ser usado para calcular mudanças mais gerais entre dois conjuntos de dados.
O código a seguir calcula as edições mínimas do exemplo canônico, passando das coleções String “Kitten” para “sentado”:
let changeset = Changeset ( source : " kitten " , target : " sitting " )
print ( changeset )
// 'kitten' -> 'sitting':
// replace with s at offset 0
// replace with i at offset 4
// insert g at offset 6A seguinte afirmação seria bem -sucedida:
let edits = [
Changeset < String > . Edit ( operation : . substitution , value : " s " , destination : 0 ) ,
Changeset < String > . Edit ( operation : . substitution , value : " i " , destination : 4 ) ,
Changeset < String > . Edit ( operation : . insertion , value : " g " , destination : 6 ) ,
]
assert ( changeset . edits == edits ) Se você não deseja a sobrecarga de Changeset , que também armazena as coleções de origem e de destino, você pode ligar diretamente para edits (aqui com dados de exemplo do Guia de Programação da Apple View View para iOS):
let source = [ " Arizona " , " California " , " Delaware " , " New Jersey " , " Washington " ]
let target = [ " Alaska " , " Arizona " , " California " , " Georgia " , " New Jersey " , " Virginia " ]
let edits = Changeset . edits ( from : source , to : target )
print ( edits )
// [insert Alaska at offset 0, replace with Georgia at offset 2, replace with Virginia at offset 4]Observe que o alterações usa compensações, não índices, para se referir a elementos nas coleções. Isso ocorre principalmente porque as coleções SWIFT não têm garantia de usar índices inteiros baseados em zero. Veja a discussão na edição #37 para mais detalhes.
Os valores de deslocamento podem ser usados diretamente nos blocos de animação de beginUpdates / endUpdates no UITableView e performBatchUpdates no UICollectionView , nesse Changeset segue os princípios explicados sob inserção, exclusão e recarga de linhas e seções no guia da Apple.
Resumidamente; Primeiro, todas as deleções e substituições são feitas, em relação à coleção de origem e, em relação à coleção resultante, inserções. Uma mudança é apenas uma exclusão seguida de uma inserção.
Na estrutura do iOS, foram incluídas duas extensões de conveniência (uma no UITableView e outra no UICollectionView ) para fazer com que a tabela/coleção animada atualize uma brisa. Basta ligar para update , assim:
tableView . update ( with : changeset . edits ) Por padrão, um Changeset usa == para comparar elementos, mas você pode escrever seu próprio comparador, ilustrado abaixo, onde a ocorrência de um "a" sempre desencadeia uma mudança:
let alwaysChangeA : ( Character , Character ) -> Bool = {
if $0 == " a " || $1 == " a " {
return false
} else {
return $0 == $1
}
}
let changeset = Changeset ( source : " ab " , target : " ab " , comparator : alwaysChangeA )Como resultado, o alterações consistirá em uma substituição do "a" (para outro "a"):
let expectedEdits : [ Changeset < String > . Edit ] = [ Changeset . Edit ( operation : . substitution , value : " a " , destination : 0 ) ]
assert ( changeset . edits == expectedEdits ) Um possível uso disso é quando uma célula em uma UITableView ou UICollectionView não deve animar quando eles mudarem.
O projeto Xcode também contém um alvo para ilustrar o uso em um aplicativo:

Isso usa as extensões mencionadas acima para animar as transições com base nas edições de um Changeset .
Este projeto está disponível sob a licença do MIT.
Copyright © 2015-18, Joachim Bondo. Consulte o arquivo de licença.