6

Mam niestandardową komórkę widoku tabeli, która korzysta z automatycznego układu i ma wskaźnik ujawnienia jako widok akcesoriów. Wielkość komórki komórek na ekranie są całkowicie błędne, gdy wyświetlona pierwsza:Niestandardowy UITableViewCell z widokiem układu automatycznego i akcesoriów

Jak widać komórka trwa około 1,5 ekranów wartości przestrzeni:

enter image description here

Jednak gdybym obracać urządzenie i obrócić z powrotem wygląda dobrze:

enter image description here

Jak widać tutaj, zrobiłem nic skomplikowanego:

enter image description here

Mam bardzo nieidealnym obejścia, która jest do zrobienia:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.tableView reloadData]; 
} 

Ale to oczywiście powoduje „błysk” Kiedy po raz pierwszy zobaczyć na ekranie. W bardziej skomplikowanym scenariuszu flash jest o wiele bardziej oczywisty.

mam innego obejścia ale to powoduje wyjątek układu auto:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    BasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath]; 
    cell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines"; 
    [cell.basicLabel layoutIfNeeded]; 
    return cell; 
} 

Wyjątek:

enter image description here

Przynajmniej ta metoda nie daje mi UI miganie.

Jeśli wyjmę widok akcesoriów, będzie on działał idealnie dobrze.

UPDATE: Dodałem projekt próbka GitHub: https://github.com/fwaddle/TableCellAccessoryTest

Aktualizacja # 2: Okazuje się, że kolejny obejść ten błąd jest do układu komórkę w kodzie. Po prostu próbowałem zrobić to samo w kodzie i nie rzuciłem ostrzeżenia i działałem dobrze. Wygląda jak błąd IB.

Wszelkie pomysły dotyczące obejścia tego problemu? Dzięki.

+0

Ustaw prawidłowo wiązania wewnątrz komórki, co czasami może być trudne, a następnie ustaw właściwość 'rowHeight' w widoku tabeli na wartość' UITableViewAutomaticDimension'. Również to nie jest wyjątek, to jest ostrzeżenie przed błędną konfiguracją. Niezatłoczony wyjątek zakończy Twoją aplikację. – Michael

+0

Hi @Nikita, więzy są ustawione prawidłowo i ustawiłem prawidłowo wysokość wiersza: - (void) viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 45; } Ale uważam, że nie stanowi to wyjątku. – Mof

+0

Myślę, że to jest problem z Twoimi ograniczeniami. Wyczyść kompilację i usuń wiązania, które nie są używane w układzie, a następnie skompiluj i uruchom. – Michael

Odpowiedz

0

Więc nawet tworzenie ograniczeń w kodzie czasami nie rozwiąże tego problemu. Wygląda na to, że potrzebujesz jeszcze kilku zmian. W niestandardowym komórce tabeli dodać zwłaszcza jeśli zmiany typu akcesoriów w zależności od zawartości komórki (np symbolem), co następuje:

-(void) setAccessoryType:(UITableViewCellAccessoryType)accessoryType { 
    [super setAccessoryType:accessoryType]; 
    [self setNeedsUpdateConstraints]; 
} 

również usunąć komórkę prototyp w serii ujęć i zarejestrować swoją klasę zamiast:

-(void) viewDidLoad { 
    [super viewDidLoad]; 
    [self.tableView registerClass:[MyCustomCell class] forCellReuseIdentifier:@"MyCustomCell"]; 
} 

ja od czasu do czasu okaże się, że nadal muszę zmusić etykiet (zwłaszcza multi-line etykiety wydaje), aby ponownie układ w cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell" forIndexPath:indexPath]; 
    cell.customLabel.text = ..... 
    [cell.customLabel layoutIfNeeded]; 
    return cell; 
} 

Wszystkie powyższe rozwiązały moje problemy, więc mam nadzieję, że są przydatne dla innych i nie marnujesz na to zbyt wiele czasu.

Nadal nie otrzymałem wiadomości od Apple o zgłoszeniu błędu, ale zakładam, że to całkiem normalne.

3

Przeprowadź poniższą metodę delegowania, ponieważ rozwiązało to problem.

- (void)tableView:(UITableView *)tableView 
willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath*)indexPath 

Widok tabeli wysyła ten komunikat do swojego delegata, tuż przed używa komórkę narysować wiersz, pozwalając tym samym na delegata, aby dostosować obiekt komórek zanim zostanie wyświetlona. Ta metoda daje delegatowi możliwość zastąpienia właściwości opartych na stanie ustawionych wcześniej w widoku tabeli, takich jak wybór i kolor tła. Po zwróceniu delegata widok tabeli ustawia tylko właściwości alfa i ramki, a następnie tylko wtedy, gdy animowane są wiersze podczas ich wsuwania lub wysuwania.

Dodaj ten kod do swojej tableViewController:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ 

    BasicCell *basicCell = (BasicCell *)cell; 
    basicCell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines"; 

} 
+0

Chociaż twoje rozwiązanie jest jak do tej pory najlepszym rozwiązaniem, nadal nie jest doskonałe. Twoje rozwiązanie nadal produkuje komórki, które są zbyt wysokie. Zobacz, co się dzieje, gdy obracasz urządzenie zgodnie z ruchem wskazówek zegara, a następnie z powrotem. Zauważysz, że komórki stają się mniejsze i niemowlęta mają odpowiednią wysokość. Złożyłem również raport o błędzie z Apple, ponieważ wygląda to jak błąd iOS. – Mof

Powiązane problemy