2011-03-17 10 views
12

Mam widok tekstowy wewnątrz UITableViewCell. Tekst wewnątrz TextView można edytować bezpośrednio na miejscu.Zmień UITable Wyświetl wysokość wiersza bez odrzucania klawiatury

Widok TextView rośnie i kurczy się w pionie w zależności od liczby wierszy tekstu. Do tej pory nie znalazłem możliwości, aby pozwolić wierszowi zawierającemu TextView rosnąć i zmniejszać się dynamicznie.

[tableView reloadData]; 

lub

[tableView reloadRowsAtIndexPaths: withRowAnimation:]; 

nie działają, ponieważ odrzucenie klawiaturę na każdej zmianie.

Czy istnieje sposób zmiany wysokości pojedynczego wiersza w widoku UITableView bez zamykania klawiatury?

Odpowiedz

30

Tak, możesz dostosować wysokość rzędów podczas pisania. To nie jest udokumentowany, a przeciwstawia powód, ale wszystko, co trzeba zrobić, to ustawić nową wartość w tableView.rowHeight (lub mieć heightForRowAtIndexPath: gotowy do obliczania nowe szczyty), następnie to zrobić:

[tableView beginUpdates]; // updates the row heights ... 
[tableView endUpdates]; // ... nothing needed in between 
+0

Tak! Niesamowite! Jedno zastrzeżenie: działa tylko wtedy, gdy zapisuję bieżący tekst na każdym zdarzeniu edycji z wewnątrz TextView do zmiennej, która wypełnia TextView przy ładowaniu komórki. beginUpdates/endUpdates nie mają dostępu do dokładnie tego samego obiektu TextView i tekstu, który faktycznie edytuję. – Stefan

+0

Wydaje się, że działa tylko dla iOS> = 4.0 bez klawiatury podskakującej w górę iw górę. – Stefan

+0

YAY! Dzięki. Zajęło mi trochę czasu, aby znaleźć właściwe słowa kluczowe Google, ale zaoszczędziłeś mi wiele kłopotów. –

0

Po reloadRowsAtIndexPaths komórka zmienia wartość pamięci, więc jeśli zadzwonisz becomeFirstResponder tuż po reloadRowsAtIndexPaths, próbujesz ustawić jako firstResponder starą komórkę, która nie istnieje (becomeFirstResponder zwraca false i klawiatury wyjść).

Rozwiązaniem jest ponowne wywołanie metody cellForRowAtIndexPath w celu uzyskania nowej wartości pamięci przeładowanej komórki, a następnie wywołanie metody beFirstResponder w tej komórce.

+0

porządku, dzięki. Niestety nadal nie ma rozwiązania pierwotnego problemu, ponieważ powoduje to, że klawiatura odbija się w dół i w górę. Wywołanie funkcji FirstResponder, mimo że działa po swojemu, jest już za późno, klawiatura już zaczęła znikać (z powodu reloadRowsAtIndexPath, którą zakładam). – Stefan

0

Zadaniem jest wywołanie rekomputacji wysokości wiersza bez ponownego użycia komórki (aby zapisać bieżącą odpowiedź).

Można zadzwonić moveRowAtIndexPath:toIndexPath: dla tego samego indexPath tuż po zmianie wysokości

- (void)textInputTableView:(UITableView *)tableView cellHeightDidChangeForIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath]; 
}