Форум программистов, компьютерный форум CyberForum.ru

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

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

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

24.04.2013, 15:06. Просмотров 1449. Ответов 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, но тоже без толку. Отсюда и вопрос: как правильно объявлять текстовые поля в таблицах, чтобы с ними можно было потом взаимодействовать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.04.2013, 15:48     Данные из TextField в динамичной таблице #2
subtaskContentTF = (UITextView *)[cell.contentView viewWithTag: 200];
subtaskContent.delegate = self;

Не в этом ли дело?
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 16:00  [ТС]     Данные из TextField в динамичной таблице #3
Очепатка в написании темы Поэтому не в этом.
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
24.04.2013, 16:20     Данные из TextField в динамичной таблице #4
так TextField или TextView?
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 16:30  [ТС]     Данные из TextField в динамичной таблице #5
TextField
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
24.04.2013, 16:41     Данные из TextField в динамичной таблице #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];
Вот так все работает. Сначала я добавлял сабвью не на контент вью, а на саму целу - тогда не работало
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 17:01  [ТС]     Данные из TextField в динамичной таблице #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

Принцип в целом ясен, но хотелось бы понять как это сделать при динамической таблице.
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
24.04.2013, 17:28     Данные из TextField в динамичной таблице #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
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.04.2013, 17:33     Данные из TextField в динамичной таблице #9
Там textFieldShouldReturn может не хватить. Из-за реюзинга. Каждое изменение отслеживать надо и соответствующий элемент в массиве сразу обновлять. Чтобы индекс узнать, можно, например, таг изменять в cellForRowAtIndexPath.
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
24.04.2013, 17:39  [ТС]     Данные из TextField в динамичной таблице #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];
Тогда просто прогнать добавление через цикл?
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.04.2013, 17:43     Данные из TextField в динамичной таблице #11
Цитата Сообщение от opi Посмотреть сообщение
Рыская по интернету наткнулся на что то типо этого:
Objective-C
1
UITextField *userField = (UITextField *)[[(UITableViewCell *)[(UITableView *)tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] contentView] viewWithTag:1001];
Руки бы оторвал...
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
24.04.2013, 17:51     Данные из TextField в динамичной таблице #12
2 mobidevelop: хватит, в один момент времени только одна TF активна, следовательно в textFieldShouldReturn придет именно эта TF и если ей отправить resign - усе должно быть Ок

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


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

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

Или воспользуйтесь поиском по форуму:
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
26.04.2013, 20:38     Данные из TextField в динамичной таблице #16
Цитата Сообщение от mobidevelop Посмотреть сообщение
Руки бы оторвал...
Сначала ноги, дабы жертва не убежала...
Yandex
Объявления
26.04.2013, 20:38     Данные из TextField в динамичной таблице
Ответ Создать тему
Опции темы

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