Używam ponownie nagłówków, zachowując je w słowniku, gdzie numer sekcji jest kluczowy, a widok nagłówka jest wartością.Ramka widoku nagłówka zmieniana na zawsze po usunięciu sekcji UITableView o numerze
Po animacji usuniętej jednej sekcji i ponownym wczytaniu kolejnej, widoki nagłówków tylko tych sekcji "zniknęły". Po kilku poszukiwaniach okazało się, że zmieniono ramki tych widoków nagłówka. Frame.X
widoku nagłówka z sekcji, która została usunięta z przesunięciem UITableViewRowAnimationRight
na szerokość ekranu po prawej (320), i tej, która została zmieniona na UITableViewRowAnimationAutomatic
przesunięta o Y
.
Główny problem i zamieszanie wynika z faktu, że nie mogę zmienić tych ramek! Cóż, początkowo się zmieniają, ale nic nie zmienia się wizualnie, a z drugiej strony ramki są ponownie przesuwane.
Oto jak to zrobić:
Załóżmy, że mamy 3 sekcji z danymi każdego leży w jednej z tablic _first
, _second
i _third
. I przez touchupinside przycisku dzwonimy pod numer handleTouchUp:
. (_second
pozostaje niezmieniona)
- (void) handleTouchUp: (UIButton *)sender
{
if ([_first count] == 0) {
sectionCount = 3;
_first = [NSMutableArray arrayWithObjects: @"First 1", @"First 2", nil];
_third = [NSMutableArray arrayWithObjects: @"Third 1", @"Third 2", @"Third 3", @"Third 4", @"Third 5", nil];
[tableView reloadData];
} else {
sectionCount = 2;
[_first removeAllObjects];
_third = [NSMutableArray arrayWithObjects: @"First 1", @"First 2", @"Third 1", @"Third 2",
@"Third 3", @"Third 4", @"Third 5", nil];
[tableView beginUpdates];
[tableView deleteSections: [NSIndexSet indexSetWithIndex: 0] withRowAnimation:UITableViewRowAnimationRight];
[tableView reloadSections: [NSIndexSet indexSetWithIndex: 2] withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];
}
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
NSNumber *key = [NSNumber numberWithInteger: section];
UIView *header = [_headers objectForKey: key];
if (header) {
} else {
header = [[UIView alloc] init];
switch (section) {
//Doing something with header here (e.g. set background color)
}
[_headers setObject:header forKey: key];
}
[header setFrame: CGRectMake(0, 0, 320, 25)];
return header;
}
Here is full code of ViewController.m i test project
UPDATE: może istnieć kilka innych błędów w projekcie, ale to nie jest ważne - to projekt testowy. Jedyny ważny problem to nieprawidłowe widoki nagłówka. Usunięcie nieprawidłowego widoku i utworzenie nowego nie jest rozwiązaniem - zabija punkt ponownego wykorzystania widoków nagłówka.
Chodziło rama nagłówek ten View staje się nieważny po animowanego delecji/reload. Wszystkie inne błędy (w tym ponowne użycie komórek) tak naprawdę nie mają znaczenia, ponieważ jest to tylko projekt testowy, który napisałem, aby pokazać problem z ramkami widoku nagłówka. Powodem, dla którego Twój projekt nie ma tego problemu, jest to, że zawsze odtwarzasz widoki nagłówków, na które miały wpływ animacje, a nie robi się tego całego punktu widoku nagłówkowego "pamięć podręczna". Również nie dostałem twojego komentarza o utracie klucza początkowego (tuż przed usunięciem nagłówka z pamięci podręcznej). – folex
Ale w każdym razie, widok nagłówka nie powinien być przerwany po animacji, to po prostu niepoprawne. Jeśli chcę korzystać z tego samego widoku, powinienem móc użyć dokładnie tego samego widoku, jeśli nie jest on uszkodzony i jeśli widok ten pokazuje jeden raz w widoku hierarchii. Jeśli możesz, spróbuj nie wyczyścić pamięci podręcznej, a skończy się uszkodzonymi widokami. – folex
Spróbuję i wyjaśnię lepiej, co mam na myśli przez niewłaściwe klucze. Masz zapisane w pamięci podręcznej widoki nagłówków dla kluczy 0,1,2. Kiedy usuniesz pierwszą sekcję (indeks = 0) i odświeżysz sekcję 2, to odświeżenie zostanie wywołane z indeksem = 1 - ponieważ pierwsza sekcja zniknęła, a wszystkie inne sekcje przesunięte o -1. Tak więc, w tym odświeżeniu nagłówka, w oparciu o twój kod zwrócony zostanie widok nagłówka z kluczem 1, ale ten dokładny uiview jest również używany do poprzedniej drugiej sekcji (która nie została odświeżona i zachowała stary widok nagłówka). Mając takie samo UIView w 2 miejscach, uważam, że powoduje problemy. –