2009-07-28 2 views
2

Я пытаюсь создать табличный вид, аналогичный просмотру видеозаписей YouTube в фотоальбоме на iPhone.UITextField в UITableViewCell - добавление новых ячеек

Вот основные настройки.

У меня есть пользовательский UITableViewCell, созданный, содержащий UITextField. Отображение ячейки в моем столе отлично работает, и я могу редактировать текст без проблем. Я создал крючок события, поэтому я могу просмотреть, когда текст был изменен в текстовом поле.

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged] 

Что я хочу сделать это. Когда пользователь первый редактирует текст, я хочу, чтобы вставить новую ячейку в виде таблицы ниже текущей ячейки (newIndexPath рассчитывается до правильного положения):

[self.tableView beginUpdates]; 
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationBottom]; 
[self.tableView endUpdates]; 

Проблема заключается в том, когда я запускаю ячейки вставки кода в ячейка создается, но текст текстового поля обновляется ненадолго, но затем клавиатура отклоняется и текстовое поле возвращается к пустой строке.

Любая помощь была бы замечательной! Я весь день бил головой об этом.

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 
{ 
    if (section == 0) 
     return 2; 
    else 
     return self.tags.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ... 
    cell = (SimpleTextFieldTableCell *)[tableView dequeueReusableCellWithIdentifier:tagCellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"SimpleTextFieldTableCell" owner:nil options:nil] lastObject]; 
    } 

    ((SimpleTextFieldTableCell *)cell).textField.delegate = self; 
    ((SimpleTextFieldTableCell *)cell).textField.tag = indexPath.row; 
    ((SimpleTextFieldTableCell *)cell).textField.text = [self.tags objectAtIndex:indexPath.row]; 
    [((SimpleTextFieldTableCell *)cell).textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
} 

- (void)textFieldDidChange:(id)sender 
{ 
    UITextField *textField = sender; 

    [self.tags replaceObjectAtIndex:textField.tag withObject:textField.text]; 
    if (textField.text.length == 1) 
    { 
     [textField setNeedsDisplay]; 
     [self addTagsCell]; 
    } 
} 

- (void)addTagsCell 
{ 
    NSString *newTag = @""; 
    [self.tags addObject:newTag]; 

    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:self.tags.count - 1 inSection:1]; 
    [self.tableView beginUpdates]; 
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationBottom]; 
    [self.tableView endUpdates]; 
} 
+0

Является ли текстовое поле пустым, если вы закомментируете вставку? – TahoeWolverine

+0

Нет, текстовое поле поддерживает введенный текст, если нет вставки. Только когда ячейка вставлена, текст исчезает. –

+0

tagCellIdentifier выше установлен в «SimpleTextFieldTableCell», который является идентификатором I, установленным для ячейки в Interface Builder. –

ответ

0

Единственное, что я могу думать здесь является то, что, возможно, при вставке строки весь вид таблицы перезагрузке, если вы не добавить ячейку правильно очереди клеток, они не будут возвращаться в состоянии, они были, поэтому вы видите пустые ячейки в результате вставки, просто предположение, надеюсь, что это поможет.

+0

Я использую ячейку, созданную с помощью построителя интерфейса, поэтому она не запускается через initWithStyle: reuseIdentifier. Может быть, это проблема? –

+0

Я просто дважды проверил, и идентификатор, который я использую для удаления ячейки, является тем же самым, который я назначил ячейке в IB. –

+0

Используете ли вы один и тот же идентификатор для всех своих ячеек? это вызовет проблемы – Daniel

0

Быстрое обновление:

не имеет значения, но я уведомления вам не нужно:

[self.tableView beginUpdates] 
[self.tableView endUpdates] 

, поскольку вы выполняете одну операцию. Не уверен, что это важно (не должно).


Update:

Я должен был сказать, что такие вопросы являются довольно распространенным явлением. Вот пост, связанный с вашим вопросом

http://www.bdunagan.com/2008/12/08/uitextview-in-a-uitableview-on-the-iphone/

Кроме того, другие отведенное это. В частности, я попытался это, без таких проблем:

http://furbo.org/2009/04/30/matt-gallagher-deserves-a-medal/

Вы могли бы использовать: http://github.com/joehewitt/three20/

Но он имеет немного кривой обучения.

Другой вопрос Stackoverflow решение этой проблемы:

Editing a UITextField inside a UITableViewCell fails

Простите, не отвечая на ваш вопрос прямо, но я думаю, что решение может содержаться в одной из этих ссылок.


Оригинал Ответ:

Try:

[newTextField setNeedsDisplay]; 

Иногда tableviews может быть "липкие" с обновлением содержания UITextView/UITextField.

Если это не сработает, убедитесь, что вы также поддерживаете модель. Вы не указали код, указывающий на то, что вы обновили модель (хотя я предполагаю, что вы это сделали, иначе это, скорее всего, вызвало бы исключение).

+0

Я пробовал звонить setNeedsDisplay безрезультатно. Я добавляю реализации метода к моему исходному сообщению, включая обновления модели. –

+0

Ах, я думаю, вы правы в вызовах beginUpdates и endUpdates. Я думал, что анимация произошла только в том случае, если внутри нее был вызван метод вставки строк, но похоже, что это просто для групп вставок и удалений. Странно, поскольку UITextField в UITableViewCell отлично работает сам по себе. Никаких проблем. Это просто вставка ячейки в событие изменения UITextField, которое вызывает проблему. Забавно, что вы должны упомянуть Три20. Я фактически использую его для большинства этого приложения. Были некоторые места, которые вручную создавали таблицу, имело больше смысла, и это было одним из них. –

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