2015-03-22 5 views
0

У меня есть пользовательский UITableView с UITextFields внутри. В cellForRow... я сделал делегата textFields. (В моем основном классе VC.) Как я получаю текст от textField на textFieldDidEndEditing, и я добавляю его к mutableArray.Когда вызывается textFieldDidEndEditing, приложение freezes

я тогда разные идентификаторы клеток, которые добавляются при получает выборе кнопки: (. Существует в этом cellIDtextField и я поставил delegate к себе)

- (IBAction)addRow:(id)sender 
{ 
    NSInteger row = [self.rowArray cound]; 
    [self.rowArray insertObject:@"anotherCell" atIndex:row]; 

    NSIndexPath *indexPath = [NSindexPath indexPathForRow:row inSection:0]; 
    [self.myTableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 

В textFieldDidEndEditing, Я сделал NSLogtextField.text, и когда этот метод вызывается из textField, который был там изначально, он работает так, как ожидалось.

Но когда textFieldDidEndEditing вызывается из textField, который находится в ячейке anotherCell (добавленная ячейка), тогда весь симулятор замерзает.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellID = [self.rowArray objectAtIndex:[indexPath row]]; 

    customCell *cell = [tableView dequeuereusablecellwithidentifier:cellID forIndexPath:indexPath]; 

    cell.name.delegate = self; // From cell that is initially there 
    cell.phoneNumber.delegate = self; // From the added cell 

    return cell; 
} 

(Если это сбивает с толку, или если вам нужно больше кода, просто дайте мне знать в комментариях. Спасибо)

Редактировать

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    if (textField.tag <= 9) 
    { 
     NSLog(@"%@", textField.text); // This works 
    } 

    UIView *superview = textField.superview; 
    while (![superview isMemberOfClass:[UITableViewCell class]]) { 
     superview = superview.superview; 
    } 
    CustomCellClass *cell = (CustomCellClass *)superview; 
    NSIndexPath *indexPath = [self.myTableView indexPathForCell:cell]; 

    if (textField.tag >= 12) 
    { 
     if ([self.inputArray count] > indexPath.row) // So I won't get the error message of [__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array' 
     { 
      for (NSUInteger i = [self.inputArray count]; i < indexPath.row; i++) { 
       [self.inputArray insertObject:@"" atIndex:i]; 
       NSLog(@"%lu", (unsigned long)i); 
      } 
     } 

     NSLog(@"%@", self.inputArray); 
    } 
} 
+0

Пробовал ли вы использовать отладчик с точкой останова в этом обратном вызове делегата, чтобы узнать, как далеко он попадает в него, если вообще до того, как приложение зависает? – clearlight

+0

Что вы делаете, это не обычный способ использования вида таблицы. У вас должен быть только один идентификатор ячейки для каждого типа ячейки. Итак, если у вас есть только один динамический прототип, у вас должен быть только один идентификатор. Кроме того, если проблема возникает при вызове textFieldDidEndEditing, то вам нужно показать, какой код у вас есть в этом методе. – rdelmar

+0

Только что [от моего вопроса с помощью метода. Кроме того, у меня есть более 1 идентификатор ячейки –

ответ

2

Ваш код застрял в бесконечный цикл здесь:

while (![superview isMemberOfClass:[UITableViewCell class]]) { 
    superview = superview.superview; 
} 

т.к. isMemberOfClass вернет true только в том случае, если класс супервизора UITableViewCell, но НЕ, если он является подклассом of UITableViewCell. Если вы измените isMemberOfClass на isKindOfClass, он должен работать. Проверьте документы Apple here.

+0

Спасибо. Кстати, при получении супервизора textField существует разница между тем, что вы разместили, и этим: CGPoint pointInTable = [textFIeld convertPoint: CGPointZero toView: _self.myTableView]; NSIndexPath * indexPath = [self.myTableView indexPathForRowAtPoint: pointInTable]; –

+0

@ Edison Я не думаю, что одно решение имеет какое-то особое преимущество перед другим. Лично мне неудобно пересматривать иерархию представлений, чтобы найти ссылку на ячейку, поэтому я предпочитаю другое решение, но это только мои личные предпочтения. – pbasdf

Смежные вопросы