自定义UITableViewCell中的UITextFields文本在滚动时出现在其他单元格中

时间:2015-01-10 10:47:00

标签: ios objective-c uitableview uitextfield

我是iOS开发的新手。我在Xcode 6(Storyboard)中创建我的应用程序。

我的问题是文本进入文本字段,滚动将文本字段文本随机地移动到其他文本字段的表格视图。我在堆栈溢出中看到了两个问题,就像这样。但那个答案并没有解决问题。

  1. MoneyEntry.xib 是一个带有一个标签和一个文本框的uitableviewcell。并向其添加类文件并连接IBOutlet并将标识符添加到uitableviewcell作为" MoneyEntryIdentifier"。

    //MoneyEntryTableViewCell.h
    
    @interface MoneyEntryTableViewCell : UITableViewCell
    
    //Money Entry Cell
    @property (strong, nonatomic) IBOutlet UILabel *lblMemName;
    @property (strong, nonatomic) IBOutlet UITextField *textAmount;
    
    @end
    
    
    //MoneyEntryTableViewCell.m
    #import "MoneyEntryTableViewCell.h"
    
    @implementation MoneyEntryTableViewCell
    
    @synthesize lblMemName,textAmount;
    - (void)awakeFromNib {
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    }
    @end
    
  2. 在Main.storyboard中添加UITableView并连接IBOutlet并添加Datasource和delegate。

    //MoneyDetailViewController.h
    
    #import <UIKit/UIKit.h>
    @interface MoneyDetailViewController : UIViewController
    @property (strong, nonatomic) IBOutlet UITableView *tblVwMoneyEntry;
    @end
    
    
    //MoneyDetailViewController.m
     @interface MoneyDetailViewController ()
     {
       NSArray *tabledata;
     }
     @end
    
     @implementation MoneyDetailViewController
    
     - (void)viewDidLoad {
      [super viewDidLoad];
      tabledata = [NSArray arrayWithObjects:@"Egg Benedict", @"Mushroom Risotto",@"Full Breakfast", @"Hamburger", @"Ham and Egg Sandwich", @"Creme Brelee",@"White Chocolate Donut", @"Starbucks Coffee", @"Vegetable Curry", nil];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
     return [tabledata count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     static NSString *CellIdentifier = @"MoneyEntryIdentifier";
     static NSString *CellNib = @"MoneyEntry";
     MoneyEntryTableViewCell *cell = (MoneyEntryTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
     if (cell == nil)
     {
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
      cell = (MoneyEntryTableViewCell *)[nib objectAtIndex:0];
     }
    
     UILabel     *lblname  = (UILabel *)    [cell lblMemName];
     UITextField *txtfield = (UITextField *)[cell textAmount];
     txtfield.tag = indexPath.row;
     lblname.text = [tabledata objectAtIndex:indexPath.row];
     txtfield.placeholder =@"0.00";
     cell.selectionStyle =UITableViewCellSelectionStyleNone;
     return cell;
     }
    
    @end
    
  3. 请解释我的细节。提前致谢

2 个答案:

答案 0 :(得分:2)

我找到了答案....只需通过标签文本将文本字段文本转换为字典setObject,然后再按标签检查文本将文本分配给相应的Textfield ..这是我的代码......

//In Interface
NSMutableDictionary *amounts;
amounts =[[NSMutableDictionary alloc]init];

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

static NSString *CellIdentifier = @"MoneyEntryIdentifier";
static NSString *CellNib = @"MoneyEntry";
MoneyEntryTableViewCell *cell = (MoneyEntryTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (!cell)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
    cell = (MoneyEntryTableViewCell *)[nib objectAtIndex:0];
}

UILabel     *lblname  = (UILabel *)    [cell lblMemName];
lblname.tag =100;
UITextField *txtfield = (UITextField *)[cell textAmount];
txtfield.tag =indexPath.row;

[txtfield addTarget:self  action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
lblname.text = tabledata[indexPath.row];
txtfield.placeholder = [NSString stringWithFormat:@"%ld",(long)indexPath.row];


if ([amounts valueForKey:lblname.text] != nil) {
    txtfield.text = [amounts valueForKey:lblname.text];
} else {
    txtfield.text = @"";
}

cell.selectionStyle =UITableViewCellSelectionStyleNone;
return cell;
}

 -(void)textFieldDidChange:(UITextField *)txtField
{
UILabel *label = (UILabel *)[txtField.superview viewWithTag:100];
NSString *labelString = label.text;
NSString *textFieldString = txtField.text;
[amounts setObject:textFieldString forKey:labelString];
}

滚动表视图时没有错误...

答案 1 :(得分:0)

您是否正在执行某些操作来存储输入到文本字段中的文本。 UITableView通过重复使用UITableViewCells不可见或离开屏幕来节省内存。

因此,如果您在单元格的文本字段中输入一些文本并且单元格离开屏幕,则单元格将排队等待以后使用。滚动时,会从此队列中添加新行,这会使textfield返回前一个文本。这就是为什么你看到你的文字随处随地弹出的原因。

您需要将每个textfield中的数据保存在单独的数组中,然后在cellForRowAtIndexPath:函数中重置它。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Your code..
    Item *item = itemArray[indexPath.row]
    cell.txtfield.text = item.amount
}

您可以使用UITextField's UIControlEventEditingChanged事件来存储更改的数组值。

-(void)textFieldDidChange:(UITextField *)txtField
{
    Item *item = itemArray[txtField.tag] 
    item.amount = txtField.text
}

您可以像这样添加textField更改方法

[textField addTarget:self 
              action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged];

使用名为Item的自定义类来存储数据。

class Item
{
     @property (nonatomic,strong) NSString *itemName;
     @property (nonatomic) float amount;  
}

itemArray将包含您的商品。

Item *it1 = [[Item alloc]init]
it1.itemName = @"Eggs Benedict"
it1.amount = ""
.... 
itemArray = [NSArray arrayWithObjects:it1,it2,it3,nil];