Прежде всего, я предполагаю, что вы используете пользовательский UITableViewCell, текстовое поле которого является одним из его параметров.
Я бы предложил создать связанную модель с этими ячейками, в которой есть параметр, который сохраняет значение текстового поля каждый раз, когда пользователь вводит новую информацию. Что-то вроде:
@interface TableViewCellModel : NSObject {
NSString * _valueOfTextfield;
}
@property (nonatomic, retain) NSString * valueOfTextfield;
@end
@implementation TableViewCellModel
@synthesize valueOfTextfield = _valueOfTextfield;
@end
Затем, когда текстовое поле нажимается, и пользователь вводит информацию и оставляет текстовое поле, обновляет связанную модель ячейки, чтобы сохранить значение текстового поля.
Если вы хотите показать ИТОГО текстовых полей во всех ячейках, просто посмотрите на каждую из ячеек, соответствующих моделям, и проверьте, имеет ли свойство valueOfTextfield
ноль или нет.
Однако, одно предупреждение: если каждый из пользовательских UITableViewCells имеет свое собственное текстовое поле, у вас могут возникнуть проблемы с производительностью, а также с событиями касания в ячейках. Возможно, вы захотите использовать одноэлементный класс, который обрабатывает текстовые поля отдельно, и каждая из пользовательских ячеек имеет ссылку на этот одноэлементный класс.
РЕДАКТИРОВАТЬ: Я играл с некоторым кодом, и я думаю, что у меня есть то, что вы хотите сейчас. Вам понадобится несколько файлов, и это займет немного времени. Они будут в .h, затем .m парах.
@interface TableViewModel : NSObject {
int _index;
NSString * _textFieldValue;
}
@property (nonatomic, assign) int index;
@property (nonatomic, retain) NSString * textFieldValue;
@end
#import "TableViewModel.h"
@implementation TableViewModel
@synthesize index = _index;
@synthesize textFieldValue = _textFieldValue;
@end
Тогда
#import <UIKit/UIKit.h>
@class TableViewModel;
@interface TableViewCell : UITableViewCell {
IBOutlet UILabel * _label;
}
@property (nonatomic, retain) TableViewModel * tableViewModel;
- (IBAction)useTextField;
@end
#import "TableViewCell.h"
#import "TableViewModel.h"
#import "AppDelegate.h"
@implementation TableViewCell
- (void)dealloc; {
[super dealloc];
}
- (void)setTableViewModel:(TableViewModel *)tableViewModel; {
_label.text = [tableViewModel textFieldValue];
}
- (TableViewModel *)tableViewModel; {
return nil;
}
- (IBAction)useTextField; {
[[AppDelegate appDelegate] useTextFieldForIndex:[self.tableViewModel index]];
}
@end
и, наконец,
#import <UIKit/UIKit.h>
@class TableViewCell;
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate> {
int _index;
NSMutableArray * _items;
IBOutlet TableViewCell * _cell;
IBOutlet UITableView * _tableView;
IBOutlet UITextField * _textField;
}
- (void)useTextFieldForIndex:(int)aIndex;
@end
#import "ViewController.h"
#import "TableViewModel.h"
#import "TableViewCell.h"
@implementation ViewController
- (void)dealloc; {
[_items release];
[super dealloc];
}
#pragma mark - View lifecycle
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad; {
[super viewDidLoad];
// This is an example of how to fill in the _items array with Models
_items = [[NSMutableArray alloc] init];
TableViewModel * model = [[TableViewModel alloc] init];
model.textFieldValue = @"1";
model.index = 0;
[_items addObject:model];
[model release];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField; {
TableViewModel * model = [_items objectAtIndex:_index];
model.textFieldValue = [_textField.text retain];
[_items replaceObjectAtIndex:_index withObject:model];
[_tableView reloadData];
[_textField resignFirstResponder];
return YES;
}
// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; {
return 1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; {
return 100;//This should be whatever the height of the cell is!
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; {
return [_items count];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; {
NSString * cellIdentifier = @"TableViewCell";
TableViewCell * cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil]; // hooks up _cell for us
cell = _cell;
}
cell.tableViewModel = ((TableViewModel *) [_items objectAtIndex:indexPath.row]);
return cell;
}
- (void)useTextFieldForIndex:(int)aIndex; {
_index = aIndex;
[_textField becomeFirstResponder];
}
@end
Я предполагаю, что вы знаете, как подключить перья, но если вам нужна дополнительная помощь, просто спросите. Также вам необходимо добавить эти 2 метода в AppDelegate.
+ (AppDelegate *)appDelegate; {
return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
- (void)useTextFieldForIndex:(int)aIndex; {
[self.viewController useTextFieldForIndex:aIndex];
}
Это позволит AppDelegate передавать действия с действиями текстового поля только в одном контроллере представления. Это также должно помочь с производительностью. Чтобы пояснить, _items содержит все модели, которые используются в табличном представлении. (Примечание: если вы хотите, чтобы пользователь добавил новую ячейку, все, что вам нужно сделать, это добавить новую модель в этот массив.)
Действие: - (IBAction)useTextField;
присоединено к кнопке очистки, и когда она нажата, она сообщает AppDelegate, чтобы сказать ViewController вызвать клавиатуру, и как только вы закончите с ней, вы обновите модель как индекс ячейки, которая была нажата, и перезагрузите представление таблицы.
Затем вы можете настроить ячейки так, как вам нужно, и убедиться, что вы подходите и к моделям.
Чтобы сложить значения в моделях, вам нужно только использовать:
double sum = 0;
for(TableViewCellModel * model in _items){
sum += [model.valueOfTextfield doubleValue];
}
Надеюсь, это поможет!