Czy ktoś ma pomysł, jak to debugować?
Ostrzeżenie tylko raz: wykryto przypadek, w którym ograniczenia niejednoznacznie sugerują wysokość zerową dla widoku zawartości komórki tabeli. Rozważamy zawalenie się niezamierzone i zamiast tego używamy standardowej wysokości.
Wiersze mają stałą wysokość określoną przez
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 34.0;
}
I wszyscy constraints
wydają się być szczęśliwi ...
Można również dodać ograniczenia pionowe od góry do dołu widoku zawartości. To sprawi, że autoukład będzie szczęśliwy (ponieważ teraz wie, jak sam obliczyć wysokość komórki).
źródło
Jeśli używasz ograniczeń autoLayout i UITableViewAutomaticDimension, ten błąd nie jest jakimś błędnym problemem do odrzucenia przez zastąpienie wysokości w kodzie. Oznacza to, że automatyczne określanie wysokości komórki nie działa, ponieważ nie masz wymaganych odpowiednich ograniczeń pionowych.
Jeśli jesteś podobny do mnie i otrzymujesz ten błąd i potrzebujesz pomocy w zidentyfikowaniu, która komórka zgłosiła błąd, możesz dodać następujący wiersz tuż przed zwróceniem metody „heightforRowAtIndexPath”.
Spowoduje to wydrukowanie długiej listy sekcji i wierszy, ale błąd pojawi się natychmiast po określonej komórce, która powoduje błąd, i możesz szybko zidentyfikować, która komórka powoduje problem i odpowiednio naprawić ograniczenia. Jest to szczególnie przydatne w przypadku komórek statycznych. Zastąpienie wysokości ręcznie wprowadzoną liczbą zadziała, jeśli nie używasz funkcji autoLayout i automatycznych wysokości komórek, ale zasadniczo wyłączy te funkcje, co jest bardzo kiepskim rozwiązaniem, jeśli próbujesz to wykorzystać.
Jeśli wcześniej nie korzystałeś z metody „heightForRowAtIndexPath”, ale chcesz zdebugować ten błąd bez cofania ustawienia UITableViewAutomaticDimension, po prostu dodaj to do swojego kodu:
źródło
Wygląda na to, że w XCode 6.1 występuje błąd, który powoduje ten problem, jeśli używasz automatycznego układu i nie określasz wartości dla wysokości wiersza dla każdej komórki widoku tabeli, ale zamiast tego pozostawiasz wartość „domyślną”. Po prostu zaznaczenie pola wyboru „Niestandardowe” obok wysokości wiersza dla każdej komórki powoduje zniknięcie ostrzeżenia.
źródło
Tak, wszystkie ograniczenia są „szczęśliwe”, nawet w przypadku, gdy masz tylko poziome ograniczenia dla elementów w komórce widoku tabeli. Miałem ten sam problem. Musisz dodać także wiązania pionowe. W ten sposób ostrzeżenie zniknie.
źródło
Ograniczenia mogą być zadowalające w przypadku układu, ale nie w przypadku automatycznej wysokości wiersza. Szczęśliwy układ oznaczałby, że treść można rozłożyć bez niejasności. To wystarczyłoby do sprawdzenia w Interface Builder.
Szczęśliwy układ dla automatycznej wysokości wiersza oznaczałby, że oprócz powyższego uwzględnisz również ograniczenia na dole komórki.
Więcej tutaj: Wykryto przypadek, w którym ograniczenia niejednoznacznie sugerują wysokość zero
źródło
Użyłem Wysokość wiersza 43 (lub <> 44) w Inspektorze rozmiaru widoku tabeli i błąd zniknął. Używając 44 otrzymuję błąd. Xcode w wersji 6.0.1.
- Ta odpowiedź została usunięta przez moderatora, proszę tego nie robić, to rozwiązuje problem. To rozwiązuje problem dla mnie i może zrobić to również dla innych. Więc czy mógłbyś być tak uprzejmy, aby nie usuwać go ponownie.
źródło
Nie udało mi się usunąć ostrzeżenia, ale aby ograniczenia działały, ustawiłem właściwość tableview new to iOS8
estimatedRowHeight
na stałą wysokość i usunąłemheightForRowAtIndexPath
implementację.źródło
Jeśli otrzymujesz to ostrzeżenie, najprawdopodobniej używasz automatycznego układu, a komórki nie mają żadnych ograniczeń.
Należy zaprzestać używania układu automatycznego lub zaimplementować ograniczenia jednoznacznie definiujące wysokość komórek.
Możesz wyłączyć automatyczny układ w narzędziu do tworzenia interfejsu, odznaczając opcję „Użyj automatycznego układu” w inspektorze plików po prawej stronie.
Jeśli zdecydujesz się na użycie automatycznego układu, a wysokość komórek jest stała, wdrożenie odpowiednich ograniczeń powinno być łatwe. Po prostu dodaj ograniczenia wysokości dla widoków podrzędnych widoku zawartości komórki i zaimplementuj ograniczenia przestrzeni pionowej między widokami podrzędnymi oraz między widokami podrzędnymi a widokiem zawartości. Na przykład, jeśli twoja komórka ma jedną etykietę, zadziała:
Więzy pionowe
Więzy poziome
źródło
Możesz użyć AutoLayout, aby obliczyć odpowiednią wysokość. Oto fajny post o dynamicznej wysokości komórki na iOS 8: http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/
źródło
W Swift wymuszenie wysokości powrotu rozwiązało mój problem:
źródło
W przypadku standardowej poprawki bagiennej, bez ograniczeń, bez szacowania wysokości lub nadmiernej inżynierii problemu. Utworzyłem domyślny projekt, podłączyłem widok tabeli, ale zapomniałem umieścić delegata wysokości w kontrolerze widoku . Aby po prostu usunąć to ostrzeżenie, potrzebujesz tego.
W kontrolerze widoku tabeli.
źródło
Używałem mapView wewnątrz uitableviewcell. Zmieniłem wysokość widoku mapy na 1/3 wielkości ekranu urządzenia. Mam ten sam błąd. Naprawiłem błąd, dodając brakujące ograniczenia do widoku zawartości uitableviewcell.
1) Wyczyść ograniczenia contentView.
2) Ustaw Reset na Sugerowane stałe do contentView.
3) Dodaj brakujące ograniczenia - jeśli takie istnieją
4) Upewniamy się, że widok treści ma wszystkie wymagane ograniczenia.
źródło
W moim przypadku dzieje się tak, ponieważ projektuję komórkę za pomocą xib i zapomniałem dodać ten plik xib do celu.
Po dodaniu tego pliku xib do celu problem zniknął
źródło
Chociaż odpowiedzi na tej stronie omawiające dodawanie ograniczeń wysokości lub ręczne zwracanie rowHeights, takich jak 44 in heightForRowAtIndexPath, powodują zniknięcie ostrzeżenia, są one zbędne, ponieważ jest to błąd w Xcode widoczny co najmniej w wersji 6.3.2 (6D2105).
Jeśli ustawisz punkt przerwania w viewDidLoad, zobaczysz self.tableView.rowHeight = -1 (UITableViewAutomaticDimension), nawet jeśli określisz wysokość wiersza 44 w serii ujęć. Dzieje się tak, ponieważ firma Apple błędnie zakłada, że chcesz mieć dynamiczne wysokości wierszy, jeśli pozostawisz wysokość wiersza na 44, ponieważ nie dostarczyły one flagi umożliwiającej określenie preferencji.
Oto kilka możliwych rozwiązań i ich wyniki:
Ustaw wysokość wiersza na 43 lub 45 w scenorysie (działa).
Ręcznie zwróć wysokość 44 w heightForRowAtIndexPath (działa).
Dodaj ograniczenia wysokości między elementami UITableViewCell i jego contentView (działa).
Niestety, te rozwiązania wymagają albo zmiany projektu, dodania niepotrzebnych ograniczeń, albo dodania niepotrzebnego kodu w celu obejścia błędu. Wypróbowałem (tak mi się wydawało) najprostsze rozwiązanie:
Naprawdę chciałem uzyskać do tego czysty scenorys, więc w końcu spróbowałem:

Te błędy są zbyt powszechne w programowaniu iOS i zmuszają programistów do spędzania nadmiernego czasu na rozważaniu konsekwencji tego, jak ich rozwiązania wpłyną na łatwość konserwacji w dłuższej perspektywie.
Ponieważ znalezienie konceptualnie poprawnego rozwiązania, które jest możliwe do utrzymania i nie wydaje się zaciemnione, jest tak nieuchwytne, i zakładając, że Apple naprawi błąd i że 44 będzie domyślną wysokością wiersza w dającej się przewidzieć przyszłości, wówczas ograniczenie lub zdefiniowane przez użytkownika rozwiązania atrybutów środowiska wykonawczego są prawdopodobnie najbardziej łatwe w utrzymaniu.
źródło
Myślę, że dzieją się tu dwie ważne rzeczy.
1) Bardzo łatwo jest zrobić błędne ograniczenia, przeciągając ctrl + przeciągając. Więc sprawdź dokładnie, czy wszystko zostało wykonane poprawnie. Aby narysować te ograniczenia, najlepiej użyć tacy po lewej stronie ekranu.
2) Zamiast określania szacowanejRowHeight w ViewDidLoad lub w innym miejscu, użyj metody delegata
To od razu rozwiązało problem.
źródło
Widziałem również ten błąd podczas korzystania z uniwersalnych scenorysów lub xibs. Jeśli zaniedbasz określenie odpowiednich ograniczeń dla klasy rozmiaru Any x Any, zauważyłem, że pojawił się ten błąd.
Wygląda na to, że Apple naprawiło to dla iOS9. U mnie błąd wystąpił dopiero w 8.4.
źródło
Przez wiele dni chodziłem w kółko między tym błędem a innym błędem, w którym tworzone były ograniczenia (nie mam pojęcia, gdzie), które kolidowały z ograniczeniami, które chciałem. Nawet działało w jednym przypadku, w którym każda widoczna właściwość była identyczna z drugą. Jedynym rozwiązaniem, które znalazłem, było przejście na atomic - utworzenie całkowicie nowego pliku za pomocą xib i ponowne rozpoczęcie ponownego łączenia gniazd, kopiowanie i wklejanie starego kodu. Może to nie jest najlepsze rozwiązanie, ale czasami, jeśli problem nie jest widoczny, pozostaje niewiele więcej do zrobienia. Przynajmniej przejście na atomic to dobry sposób na sprawdzenie, co się dzieje.
źródło