2013-06-15 3 views
1

Я начинаю разработку ios, и для начала я подумал, что будет интересно сделать измерительный преобразователь.Получение события из ячейки таблицы

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UILabel *label; 
    UITextField *field; 
    static NSString *CellIdentifier = @"DimensionCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    label = (UILabel *)[cell viewWithTag:1]; 
    field = (UITextField *)[cell viewWithTag:2]; 
    field.delegate = self; 
    NSString *DimensionLabel = [self.dimension objectAtIndex:indexPath.row]; 
    label.text = DimensionLabel; 
    return cell; 
} 
+0

Поскольку вам нужно будет изменить все текстовые поля всякий раз, когда кто-либо из них изменится, возможно, было бы проще всего создать ролеты для всех и обратиться к ним непосредственно всякий раз, когда текстовое поле будет редактироваться (или изменилось, если вы предпочитаете его в реальном времени). – lnafziger

+0

@Inafziger вот почему я не хочу использовать розетки. Я хочу, чтобы текстовые поля создавались автоматически, поэтому я могу просто добавить новое измерение в массив, и он будет готов к работе. Также это поможет мне использовать один и тот же вид для разных мер. – mjanisz1

+0

В этом случае проще всего обновить источник данных и вызвать reloadData в представлении таблицы, так как вам все равно необходимо их обновить. Другой вариант - просмотреть все виды таблиц visibleCells и получить ссылки на ярлыки так же, как вы делаете в cellForRowAtIndexPath в исходном коде. – lnafziger

ответ

3

Вам нужно установить делегат UITextField как ViewController предъявившему Tableview.

Вы можете дать каждому тегу textField, или вы можете проверить точку текстового поля в делегате textFieldDidEndEditing:, чтобы найти indexPath для идентификации textField.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier 
                  forIndexPath:indexPath]; 

    cell.customTextField.delegate = self; 
    //You can use tag if there is only one section 
    //If there is more than one section then this will be ambiguos 
    cell.customTextField.tag = indexPath.row; 

    //Set other values 

    return cell; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField{ 

    CGPoint textFieldOrigin = [textField convertPoint:textField.frame.origin toView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:textFieldOrigin]; 
    //Now you can use indexPath for updating your dataSource 

} 
+0

спасибо! первая часть работает хорошо - я могу добраться до текстового поля. Но теперь, как получить все другие текстовые поля в других ячейках? – mjanisz1

+0

@ mjanisz1 Это общий. Вы должны установить делегат для всех текстовых полей в ячейках. Все они пройдут через этот метод textFieldDidEndEditing:. Вам нужно представить свой конкретный способ использования indexPath, чтобы узнать, что именно. Или если вы можете поделиться больше информации о dataSource и ячейке. Я могу дать вам предложение. – Anupdas

+0

Я отредактировал вопрос, чтобы вы могли видеть, как я делаю ячейку. Я попытался изменить textfield.text только на простую строку, но он изменяется только в том, что закончено редактирование (sry я не знаю, как подключить его ко всем текстовым полям). Если вы объясните мне это, остальное будет просто тривиально;) – mjanisz1

0

Недвижимость UITextField можно использовать как собственность restorationId. Дайте restorationID каждого текстового поля, как это:

textField.restorationID = @"dimension1"; 
textField.delegate = self; 

Затем в следующем TextField метод делегата вы можете проверить restorationID, чтобы определить, какие TextField был отредактирован.

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    if([textField.restorationID isEqualToString:@"dimension1"]) 
    { 
     // perform calculation and any updation required. 
    } 
} 

Я просто предлагаю вам использовать имя измерения как идентификатор восстановления. Это может помочь вам определить текстовое поле в методе делегата.

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