2012-12-05 5 views
6

Zajmuję się tworzeniem aplikacji na iPada. Mam UITableview w aplikacji. Widok UITableview jest tworzony programowo z jedną etykietą i widokiem tekstowym jako jego podgląd. W widoku tabeli może być maksymalnie pięć wierszy. W czasie wyświetlane są użytkownikowi 2 wiersze. W środowisku wykonawczym wymagane jest wpisanie tekstu w wyglądzie tekstowym & zapisz go w lokalnej bazie danych sqlite. Zaimplementowałem delegatów textViewDidBeginEditing i textViewDidEndEditing w kodzie. W tekście delegataViewDidEndEditing próbuję dodać/zamienić tekst (wprowadzony w widoku tekstowym) w tablicy NSMUtable. W tym celu wymagany jest tekst wiersza z tekstem, do którego wpisuję tekst. Tak, że mogę dodać/zamienić odpowiedni indeks wiersza w tablicy.Uzyskaj indeks wiersza niestandardowej komórki w widoku UITable

Proszę dać mi znać, jak uzyskać indeks wierszy widoku tekstowego.

Odpowiedz

20

Twoja TextView będzie zawarta w jakiejś komórce. Po znalezieniu tej komórki możesz poprosić tabelę o indeks. Przejdź z poziomu swojej TextView w górę hierarchii widoków, aby znaleźć komórkę. Na przykład:

TextView* textView = // your textView; 
UITableViewCell* cell = (UITableViewCell*)[textView superview]; 
UITableView* table = (UITableView *)[cell superview]; 
NSIndexPath* pathOfTheCell = [table indexPathForCell:cell]; 
NSInteger rowOfTheCell = [pathOfTheCell row]; 
NSLog(@"rowofthecell %d", rowOfTheCell); 
+0

dzięki za odpowiedź. Działa to w niektórych scenariuszach, aw innych przypadkach daje niewłaściwy indeks wiersza. Tak jak w przypadku nawigacji od wiersza 0 do wiersza 5, a następnie do wiersza 4, a następnie do wiersza 0, w widoku tekstowymDidEndedycja pokazuje indeks path.row jako 0, podczas gdy powinien pokazywać 3, który jest indeksem wiersza, który edytowałem. – user1531912

4

to naprawdę proste, w cellForRowAtIndexPath. tylko otagować textView jak

cell.txtView.tag = indexPath.row; 

w metodzie TextView Delegata znaleźć wiersz używając następującego kodu (textViewDidBeginEditing)

int row = textView.tag; 
+3

Należy zachować ostrożność podczas dodawania lub usuwania komórek z tableView po ustawieniu tego znacznika - kolejność zostanie zmieniona, pozostawiając znaczniki o nieprawidłowych wartościach. – tombeynon

1

systemem iOS 8.3 znaleźć i wdrożyć to w textViewDidEndEditing
metody; działa dobrze!

UIView *parentCell = sender 
while (![parentCell isKindOfClass:[UITableViewCell class]]) { // iOS 7 onwards the table cell hierachy has changed. 
    parentCell = parentCell.superview; 
} 

UIView *parentView = parentCell.superview; 

while (![parentView isKindOfClass:[UITableView class]]) { // iOS 7 onwards the table cell hierachy has changed. 
    parentView = parentView.superview; 
} 


UITableView *tableView = (UITableView *)parentView; 
NSIndexPath *indexPath = [tableView indexPathForCell:(UITableViewCell *)parentCell]; 

NSLog(@"indexPath = %@", indexPath); 
3

W Swift działa na iOS 8.4:

@IBAction func signInUpBigButtonPressed(sender: SignInUpMenuTableViewControllerBigButton) { 
    // We set the self.indexCellContainingButtonClicked with the cell number selected. 
    var parentCell: UIView! = sender 
    do { 
     parentCell = parentCell.superview! 
    } while !(parentCell is UITableViewCell) 
    let cell = parentCell as! UITableViewCell 
    self.indexCellContainingButtonClicked = self.tableView.indexPathForCell(cell)!.row 
} 
+0

Dokładnie tego, czego szukałem, dzięki. –

2

Jest to bardziej elegancki sposób, aby osiągnąć to, co prosiłeś

CGPoint senderPosition = [sender convertPoint:CGPointZero toView:self.tableView]; 

NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:senderPosition];