Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
#1

Данные из TextField в динамичной таблице - Программирование iOS

24.04.2013, 15:06. Просмотров 1557. Ответов 15
Метки нет (Все метки)

Добрый день.
У меня есть таблица, количество ячеек которой может изменятся. В каждой ячейке имеется текстовое поле. Вот у меня возникает вопрос: как мне по окончанию редактирования всех текстовых полей (от 1 до 20) занести все данные в массив? как мне их считать?
И еще вопрос. Объявляю в классе текстовое поле таким образом - объявляю переменную UITextField *subtaskContentTF использую ее так:
Objective-C
1
2
3
4
5
6
7
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
subtaskContentTF = (UITextView *)[cell.contentView viewWithTag: 200];
subtaskContent.delegate = self;
...
}
Но в методе textFieldShouldReturn:textField не срабатывает [subtaskContentTF resightFirstResponder]. Так же не срабатывают методы textFieldDidEndEditing:textField и textFieldDidBeginEditing:textField. Пробовал объявлять не через глобальную переменную subtaskContentTF, но тоже без толку. Отсюда и вопрос: как правильно объявлять текстовые поля в таблицах, чтобы с ними можно было потом взаимодействовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2013, 15:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Данные из TextField в динамичной таблице (Программирование iOS):

Как сохранить введенные данные пользователя в поле TextField нажатием клавиши «done» на клавиатуре? - Swift
Всем привет! Помогите решить проблему. Есть поле UITextField, пользователь вводит в него текст и нажимает на клавиатуре кнопку "Done",...

AlertView и TextField - Программирование iOS
Здравствуйте, у меня есть таблица с кастомными ячейками, и alertview который содержит 2 текст филда, и объект который должен записываться в...

Textfield деление - Swift
Есть два текстфилда, нужно сделать так, что бы по нажатию кнопки введенное число в первый текстфилд делилось на число введенное во второй...

Посчитать определенные символы в TextField - Swift
Уже голову сломал как делать... Думаю что надо создать строку с этим символом и присвоить ей единицу, но не получается...

Скрыть символы в textField. Запретить ввод менее 6 символов! - Swift
Добрый день программеры iOS! Вот пытаюсь разработать страницу регистрации в мобильном приложении (учу Swift) как Вы уже, думаю,...

TextField - Objective-C
помогите плз ... есть 3 текст филда IBOutlet UITextField *q1; IBOutlet UITextField *q2; IBOutlet UITextField *q3; в первые...

15
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.04.2013, 15:48 #2
subtaskContentTF = (UITextView *)[cell.contentView viewWithTag: 200];
subtaskContent.delegate = self;

Не в этом ли дело?
0
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 16:00  [ТС] #3
Очепатка в написании темы Поэтому не в этом.
0
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
24.04.2013, 16:20 #4
так TextField или TextView?
0
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 16:30  [ТС] #5
TextField
0
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
24.04.2013, 16:41 #6
А можешь проверить, точно ли TextField лежит у тебя в contentView?

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"piu"];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"piu"];
        UITextField* tf = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
        tf.tag = 100;
 
        [tfs addObject:tf];
        [cell.contentView addSubview:tf];
    }
    
    [(UITextField*)[cell.contentView viewWithTag:100] setDelegate:self];
Вот так все работает. Сначала я добавлял сабвью не на контент вью, а на саму целу - тогда не работало
0
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 17:01  [ТС] #7
То что текстфилд сомнений нет. Ладно, с этим как нибудь постараюсь разобраться. На данный момент я хотел бы узнать логику как считывать данные с этих текстфилдов? Чтобы в последствии занести их массив. Размер объявлен глобальной переменной, а capacity указывается при указании количества генерации ячеек.
Objective-C
1
subtaskListArray = [[NSMutableArray alloc] initWithCapacity: rowCount];
Вот как мне взять нововведенные данные и сохранить их? Нашел пример как присваивать данные переменным, но с заранее объявленным числом полей и этих самих переменный. Мне кажется, что такой вариант мне не подойдет, ибо не вижу смысла объявлять 20 раз поля и переменные. Вот код:
Кликните здесь для просмотра всего текста
.h
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//
//  FormTableController.h
//  TableWithTextField
//
//  Created by Andrew Lim on 4/15/11.
#import <UIKit/UIKit.h>
 
@interface FormTableController : UITableViewController<UITextFieldDelegate> {
    NSString* name_ ;
    NSString* address_ ;
    NSString* password_ ;
    NSString* description_ ;    
    
    UITextField* nameField_ ;
    UITextField* addressField_ ;
    UITextField* passwordField_ ;
    UITextField* descriptionField_ ;    
}
 
// Creates a textfield with the specified text and placeholder text
-(UITextField*) makeTextField: (NSString*)text  
                  placeholder: (NSString*)placeholder  ;
 
// Handles UIControlEventEditingDidEndOnExit
- (IBAction)textFieldFinished:(id)sender ;
 
@property (nonatomic,copy) NSString* name ;
@property (nonatomic,copy) NSString* address ;
@property (nonatomic,copy) NSString* password ;
@property (nonatomic,copy) NSString* description ;
 
@end
.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//
//  FormTableController.m
//  TableWithTextField
//
//  Created by Andrew Lim on 4/15/11.
#import "FormTableController.h"
 
@implementation FormTableController
@synthesize name = name_ ;
@synthesize address = address_ ;
@synthesize password = password_ ;
@synthesize description = description_ ;
 
#pragma mark -
#pragma mark Initialization
 
#pragma mark -
#pragma mark View lifecycle
 
- (void)viewDidLoad {
  [super viewDidLoad];
    
    self.name        = @"" ;
    self.address     = @"" ;
    self.password    = @"" ;
    self.description = @"" ;
}
 
 
#pragma mark -
#pragma mark Table view data source
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  // Return the number of sections.
  return 1;
}
 
 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  // Return the number of rows in the section.
  return 4;
}
 
 
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
                 cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
 
    // Make cell unselectable
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    UITextField* tf = nil ; 
    switch ( indexPath.row ) {
        case 0: {
            cell.textLabel.text = @"Name" ;
            tf = nameField_ = [self makeTextField:self.name placeholder:@"John Appleseed"];
            [cell addSubview:nameField_];
            break ;
        }
        case 1: {
            cell.textLabel.text = @"Address" ;
            tf = addressField_ = [self makeTextField:self.address placeholder:@"example@gmail.com"];
            [cell addSubview:addressField_];
            break ;
        }       
        case 2: {
            cell.textLabel.text = @"Password" ;
            tf = passwordField_ = [self makeTextField:self.password placeholder:@"Required"];
            [cell addSubview:passwordField_];
            break ;
        }   
        case 3: {
            cell.textLabel.text = @"Description" ;
            tf = descriptionField_ = [self makeTextField:self.description placeholder:@"My Gmail Account"];
            [cell addSubview:descriptionField_];
            break ;
        }               
    }
 
    // Textfield dimensions
    tf.frame = CGRectMake(120, 12, 170, 30);
    
    // Workaround to dismiss keyboard when Done/Return is tapped
    [tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];    
    
    // We want to handle textFieldDidEndEditing
    tf.delegate = self ;
    
  return cell;
}
 
#pragma mark -
#pragma mark Table view delegate
 
#pragma mark -
#pragma mark Memory management
 
- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    // Relinquish ownership any cached data, images, etc. that aren't in use.
}
 
- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}
 
- (void)dealloc {
    [super dealloc];
}
 
-(UITextField*) makeTextField: (NSString*)text  
                  placeholder: (NSString*)placeholder  {
    UITextField *tf = [[[UITextField alloc] init] autorelease];
    tf.placeholder = placeholder ;
    tf.text = text ;         
    tf.autocorrectionType = UITextAutocorrectionTypeNo ;
    tf.autocapitalizationType = UITextAutocapitalizationTypeNone;
    tf.adjustsFontSizeToFitWidth = YES;
    tf.textColor = [UIColor colorWithRed:56.0f/255.0f green:84.0f/255.0f blue:135.0f/255.0f alpha:1.0f];    
    return tf ;
}
 
// Workaround to hide keyboard when Done is tapped
- (IBAction)textFieldFinished:(id)sender {
    // [sender resignFirstResponder];
}
 
// Textfield value changed, store the new value.
- (void)textFieldDidEndEditing:(UITextField *)textField {
    if ( textField == nameField_ ) {
        self.name = textField.text ;
    } else if ( textField == addressField_ ) {
        self.address = textField.text ;
    } else if ( textField == passwordField_ ) {
        self.password = textField.text ;
    } else if ( textField == descriptionField_ ) {
        self.description = textField.text ;     
    }
}
 
@end

Принцип в целом ясен, но хотелось бы понять как это сделать при динамической таблице.
0
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
24.04.2013, 17:28 #8
Objective-C
1
2
3
4
5
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
Вот этот метод еще добавь.

А вообще… Тебе в какой момент надо записать данные в массив?
Когда ты создаешь массив с capacity - это значит, что ты рекомендуешь выделить память под такое количество объектов. Но это не значит, что ты не сможешь внести в него большее количество объектов.

Если тебе надо, например, по выходу с текущей вьюхи сохранить все введенные данные - ты из TableView можешь вытащить все cell через - (UITableViewCell *)cellForRowAtIndexPathNSIndexPath *)indexPath
и уже из целов повытягивать все нужные данные…


Objective-C
1
[cell addSubview:nameField_];
Вооот, это то, о чем я и говорил
Objective-C
1
subtaskContentTF = (UITextView *)[cell.contentView viewWithTag: 200];
Это не должно было вытащить твою TF
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.04.2013, 17:33 #9
Там textFieldShouldReturn может не хватить. Из-за реюзинга. Каждое изменение отслеживать надо и соответствующий элемент в массиве сразу обновлять. Чтобы индекс узнать, можно, например, таг изменять в cellForRowAtIndexPath.
0
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 17:39  [ТС] #10
Цитата Сообщение от Dargo Посмотреть сообщение
Когда ты создаешь массив с capacity - это значит, что ты рекомендуешь выделить память под такое количество объектов. Но это не значит, что ты не сможешь внести в него большее количество объектов.
Просто сталкивался с моментами, когда массив был всегда null, если не указывать capacity.

Вытягивать данные нужно или по выходу с вьюшки, либо же просто по завершению редактирования ячейки. Я так понимаю можно добавить через иф на редактирование subtaskContentTF или на возвращение return поля. А как мне вытащить через целл данные? Рыская по интернету наткнулся на что то типо этого:
Objective-C
1
UITextField *userField = (UITextField *)[[(UITableViewCell *)[(UITableView *)tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] contentView] viewWithTag:1001];
Тогда просто прогнать добавление через цикл?
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.04.2013, 17:43 #11
Цитата Сообщение от opi Посмотреть сообщение
Рыская по интернету наткнулся на что то типо этого:
Objective-C
1
UITextField *userField = (UITextField *)[[(UITableViewCell *)[(UITableView *)tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] contentView] viewWithTag:1001];
Руки бы оторвал...
0
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
24.04.2013, 17:51 #12
2 mobidevelop: хватит, в один момент времени только одна TF активна, следовательно в textFieldShouldReturn придет именно эта TF и если ей отправить resign - усе должно быть Ок

2 opi: ага, церез цикл. Ты можешь узнать количество целов в таблице через [tableView numberOfRowsInSection:0];
и там циклом. Только следи за тем, откуда ты вытаскиеваешь сабвью по тэгу.
По поводу NULL - всегда надо инициализировать, но можна и просто [[NSMutableArray alloc] init]. С капасити есть смысл инициализировать, если тебе важна скорость работы приложения и в частности добавление объектов в массив. Там на выделение новой памяти тратится время (не критично, но все же)…


А вообще я бы, наверна сделал сабклас целы… и в нем управлял всем, что надо.
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.04.2013, 18:00 #13
Цитата Сообщение от Dargo Посмотреть сообщение
2 mobidevelop: хватит, в один момент времени только одна TF активна, следовательно в textFieldShouldReturn придет именно эта TF и если ей отправить resign - усе должно быть Ок
Скролл-то никто не отменял. Уедет она за видимую область и приедет на ячейке с другим индексом. И юзерские данные перепутаются. Хотя, это от реализации cellForRowAtIndexPath зависит... Может и ласты склеить...
0
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 18:00  [ТС] #14
Цитата Сообщение от Dargo Посмотреть сообщение
Ты можешь узнать количество целов в таблице через [tableView numberOfRowsInSection:0];
Их количество мне и так известно в принципе, так что это не пригодится. Но на будущее рано или поздно пригодится, спасибо
2mobidevelop, если так печально, как тогда лучше будет?
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.04.2013, 18:02 #15
Лучше как Dargo посоветовал.
Цитата Сообщение от Dargo Посмотреть сообщение
А вообще я бы, наверна сделал сабклас целы… и в нем управлял всем, что надо.
1
24.04.2013, 18:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2013, 18:02
Привет! Вот еще темы с ответами:

Числа из TextField в CGFloat - Objective-C
Здравствуйте. Пользователь вводит числа в поле, мне нужно сохранить эти значения в перменные типа CGFloat. Как можно сделать? Заранее...

Изменение TextField в CollectionView с использованием биндов - Objective-C
Помогите пожалуйста разобраться с некоторыми полями в Binding Inspector! Есть CollectionView и автосозданная Вьюшка. В эу вьюшку...

Считать данные с TextField - Java
Как считать данные TextField и внести в массив ? так? int value = ((TextField)event.getsourse()).getText();

Не получается перезадать данные в TextField - Java
Есть два окна. В одном мы задаём данные для вычисления интеграла и его прорисовки, а а в другом - рисуется сам график. Проблема заключается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru