2013-07-14 23 views
-2

Как создать UITableView со следующей функциональностью:Dynamic UITableView с UITextField

Я хотел бы мое UITableView клетки, чтобы UITextfields в них. Когда пользователь начинает вводить UITextField, табличное представление автоматически генерирует и новую, идентичную ячейку чуть ниже нее. Это по существу для формы с «бесконечным» числом полей.

Любые указатели/советы по написанию это было бы здорово!

Создание пользовательских ячейки в раскадровки Вопрос # 1

При создании пользовательского ячейки в раскадровку, я могу просто создать «пользовательские ячейки» в Tableview в моем ViewController? Если это так, мне нужно изменить класс, который наследует ячейка?

enter image description here

Создание пользовательских ячейки в раскадровки Вопрос # 2

Не могли бы вы вкратце объяснить, что идентификатор ячейки используется для?

enter image description here

Дополнительный код:

Для создания пользовательского UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = @"AddListInformationCellid"; 
    AddListInformationCell *cell = (AddListInformationCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"AddListInformationCell" owner:self options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell = (AddListInformationCell *)currentObject; 
       break; 
      } 
     } 
    } 

    return cell; 
} 

Спасибо очень много.

+0

Пожалуйста, поделитесь некоторые примеры кода с нами : что вы пробовали, как вы ожидаете, чтобы иметь возможность архитекторов и т. д. Быть конкретной. :) – jaredsinclair

ответ

1

Я бы сделал это с пользовательской ячейкой, которая содержит текстовое поле. В моем примере ниже у меня есть ячейка (созданная в раскадровке), в которой есть текстовое поле и ярлык. Когда пользователь начинает печатать, я добавляю запись (только строка «New») на мой массив, и вставить новую ячейку ниже той, которую пользователь вводит в.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.theData = [@[@"One",@"Two",@"Three",@"Four"] mutableCopy]; 
    [self.tableView reloadData]; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.theData.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    cell.label.text = self.theData[indexPath.row]; 
    return cell; 
} 

-(BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return YES; 
} 

-(void)textFieldDidBeginEditing:(UITextField *)textField { 
    self.beganEditing = YES; 
} 

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    if (self.beganEditing) { 
     NSInteger row = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview].row; 
     [self.theData insertObject:@"New" atIndex:row + 1]; 
     [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row + 1 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic]; 
     self.beganEditing = NO; 
    } 
    return YES; 
} 
+0

Большое спасибо за ваш ответ. Не могли бы вы взглянуть на мой пересмотренный вопрос, когда у вас появится такая возможность? Еще раз спасибо! – Apollo

+0

@Auser, да, вам нужно создать собственный класс ячеек и изменить класс ячейки на тот, что в раскадровке. Единственное, что вам нужно добавить в этот пользовательский класс, это IBOutlets для ваших элементов пользовательского интерфейса, например текстовое поле. Вам ничего не нужно в файле .m. Идентификатор используется для идентификации ячейки, которую получает табличный вид - тот, который вы добавляете в IB, должен соответствовать тому, который вы передаете в dequeueReusableCellWithIdentifier: forIndexPath: – rdelmar

+0

Отлично, спасибо за информацию. – Apollo

-2

Вам необходимо использовать свойство вашей камеры. contentView. Убедитесь, что ваш контроллер просмотра соответствует протоколам UITableViewDelegate, UITableViewDataSource и UITextViewDelegate. В вашем методе cellForRowAtIndexPath, вы должны иметь что-то вроде этого:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(30, 7, 150, 30)]; 
    [textField setDelegate:self]; 
    [textField setBorderStyle:UITextBorderStyleRoundedRect]; 
    [cell.contentView addSubview: textField]; 
    [cell.textLabel setText:@""]; 
    return cell; 
} 

Тогда в вашем методе textFieldShouldBeginEditing, добавьте к отсчету ячеек, которые вы хотите иметь, а затем использовать этот счет в методе numberOfRowsInSection: для источника данных ,

+2

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

+0

@Jumhyn Мне нужно сделать данные перезагрузки таблицы, или мое обновление таблицы будет автоматически, когда я увеличу счетчик для numberOfRowsinSection? Спасибо за вашу помощь! – Apollo

+0

@vikingosegundo Обновлен код. @Auser Вы должны использовать 'reloadData'. Не также, что это самая основная реализация того, что вы просите, и если вы, например, имеете массив элементов для отображения в представлении таблицы, вы должны добавить элемент в массив в методе редактирования текстового поля и используйте '[array count]' в 'numberOfRowsInSection'. – Jumhyn

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