如何为iOS中的每个文本字段创建可访问和可编辑的动态文本字段

时间:2015-01-24 09:10:11

标签: ios iphone xcode

任何人都可以帮助我吗?我想在循环中创建动态text field。我已经能够创建并使其可编辑。我的要求如下。 我希望访问每个text fields值,并将这些值的总和存储在Label中。 II。假设有5个动态创建的文本字段具有值(10,20,30,40,50)。 所以标签显示5个值的总和。即。 10 + 20 + 30 + 40 + 50 = 150 如果我对textfield值进行了更改,则应重新计算并更改label中的总和。 我的逻辑如下。

- (无效)创建 {

    myarr = [NSMutableArray arrayWithObjects:@"1000",@"2000",@"3000",@"4000",@"5000", nil];

int x = 20, y = 50;
int width = 280, height = 40;
for (int item=0; item<[myarr count]; item++)
{
    edit_txt = [[UITextField alloc]initWithFrame:CGRectMake(x, y, width, height)];
    edit_txt.text = [NSString stringWithFormat:@"%@",[myarr objectAtIndex:item]];
    [edit_txt setTag:item+1];
    edit_txt.placeholder  = @"Click here to type";
    edit_txt.borderStyle = UITextBorderStyleRoundedRect;
    edit_txt.font = [UIFont systemFontOfSize:15];
    edit_txt.textAlignment = NSTextAlignmentLeft;
    edit_txt.returnKeyType = UIReturnKeyDefault;
    edit_txt.delegate = (id)self;
    [self.view addSubview:edit_txt];
    y += height;
}

tot_txt = [[UITextField alloc]initWithFrame:CGRectMake(edit_txt.frame.origin.x, edit_txt.frame.origin.y + height + 10, width , height)];
tot_txt.placeholder  = @"Total Value";
tot_txt.borderStyle = UITextBorderStyleRoundedRect;
tot_txt.font = [UIFont systemFontOfSize:15];
tot_txt.textAlignment = NSTextAlignmentLeft;
tot_txt.returnKeyType = UIReturnKeyDefault;
tot_txt.delegate = (id)self;
[self.view addSubview:tot_txt];


save_btn = [UIButton buttonWithType:UIButtonTypeCustom];
[save_btn setFrame:CGRectMake(tot_txt.frame.origin.x, tot_txt.frame.origin.y + height + 10, width , height)];
[save_btn setTitle:@"Save" forState:UIControlStateNormal];
[save_btn addTarget:self action:@selector(save_click:) forControlEvents:UIControlEventTouchUpInside];
[save_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[self.view addSubview:save_btn];
CALayer *btnlayer = [save_btn layer];
[btnlayer setBorderColor:[UIColor redColor].CGColor];
[btnlayer setBorderWidth:0.3];
[btnlayer setCornerRadius:20.0];

}

-(void)textFieldDidEndEditing:(UITextField *)textField

{     int count = 0;

for (int item = 0; item < [myarr count]; item++)
{
    UITextField *textField = ([[self.view viewWithTag:item + 1] isKindOfClass:[UITextField class]])?(UITextField *)[self.view viewWithTag:item + 1]:nil;
    count += [textField.text intValue];
}
tot_txt.text = [NSString stringWithFormat:@"%d", count];

}

提前致谢。 Ajeet Kumar。

2 个答案:

答案 0 :(得分:1)

这会更容易,

要访问每个文本字段(范围仅在循环内可用),您可以使用文本字段的tag属性。

示例:

for (int itemIndex = 1; itemIndex <= 5; itemIndex++)
{
      UITextField *textField = [[UITextField alloc] initWithFrame:yourFrame];

      //all properties assigning here

      textField.tag = itemIndex; //assigning tag here(starts from 1).
      textField.delegate = self;
      [self.view addSubview: textField];
}

现在,进行计算。实施UITextField代表。

在您的.h文件中写下<UITextFieldDelegate>

@interface yourClassName : UIViewController <UITextFieldDelegate>

在结束编辑时计算,

-(void)textFieldDidEndEditing:(UITextField *)textField  
{
    int count = 0;

    for (int itemIndex = 1; itemIndex <= 5; itemIndex++)
    {
          UITextField *textField = ([[self.view viewWithTag:itemIndex] isKindOfClass:[UITextField class]])?(UITextField *)[self.view viewWithTag:itemIndex]:nil;

          count += [textField.text intValue];
    }

    countLabel.text = [NSString stringWithFormat:@"%d", count];
}     

要在编辑时进行计算,请实施委托shouldChangeCharactersInRange并使用相同的代码库。

同时实现代理textFieldShouldCleartextFieldShouldReturn并使用相同的代码库。

除了这些测试字段外,请确保您的视图没有包含1到5标记的任何元素。

此外,您可以通过应用您的想法来避免循环;)

答案 1 :(得分:0)

我确实喜欢这个,

#import "ViewController.h"

@interface ViewController () <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate> {

    UITableView* _tableView;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 100, 768, 600) style:UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    [self.view addSubview:_tableView];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{

    return 5;
}

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

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"SomeCell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SomeCell"];
        UITextField* _textField = [[UITextField alloc] initWithFrame:CGRectMake(5, 5, 600, 40)];
        _textField.delegate = self;
        _textField.tag = indexPath.row + 1;
        [_textField setBackgroundColor:[UIColor lightGrayColor]];
        [_textField addTarget:self action:@selector(onTextChange:) forControlEvents:UIControlEventEditingChanged];
        [cell.contentView addSubview:_textField];
    }

    return cell;
}

- (void)onTextChange:(id)sender
{

    double result = 0.0;
    for (int itemIndex = 0; itemIndex < 5; itemIndex++) {
        UITableViewCell* cell = [_tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:itemIndex inSection:0]];
        UITextField* fooTF = (UITextField*)[cell.contentView viewWithTag:itemIndex + 1];
        result += [fooTF.text doubleValue];
    }
    // update your lable here
    NSLog(@"result %f", result);
    //for sample
    self.title = [NSString stringWithFormat:@"%f", result];
}
- (float)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{

    return 50.0;
}

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string
{
    NSNumberFormatter* nf = [[NSNumberFormatter alloc] init];
    [nf setNumberStyle:NSNumberFormatterNoStyle];

    NSString* newString = [NSString stringWithFormat:@"%@%@", textField.text, string];
    NSNumber* number = [nf numberFromString:newString];

    //allow only numbers
    if (number)
        return YES;
    else
        return NO;
}