自定义 UITableViewCell 中的 UITextFields 文本在滚动时出现在其他单元格中
UITextFields text in custom UITableViewCell appears in other cell while Scrolling
我是 iOS 开发的新手。我在 Xcode 6(故事板)中创建我的应用程序。
我的问题是文本输入文本字段,滚动 table 视图随机将文本字段文本随机移动到其他文本字段。我在这样的堆栈溢出中看到了两个问题。但那个答案并没有解决问题。
MoneyEntry.xib 是一个带有一个标签和一个文本框的 uitableviewcell。并向其添加 class 文件并连接 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
在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
请详细解释一下。提前致谢
您是否正在做一些事情来存储输入到文本字段中的文本。 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 来存储您的数据。
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];
我找到了答案....只需通过标签文本将文本字段文本放入字典 setObject 中,然后再次通过标签文本检查将文本分配给相应的文本字段..这是我的代码...
//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];
}
滚动时没有错误 table 查看...
我是 iOS 开发的新手。我在 Xcode 6(故事板)中创建我的应用程序。
我的问题是文本输入文本字段,滚动 table 视图随机将文本字段文本随机移动到其他文本字段。我在这样的堆栈溢出中看到了两个问题。但那个答案并没有解决问题。
MoneyEntry.xib 是一个带有一个标签和一个文本框的 uitableviewcell。并向其添加 class 文件并连接 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
在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
请详细解释一下。提前致谢
您是否正在做一些事情来存储输入到文本字段中的文本。 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 来存储您的数据。
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];
我找到了答案....只需通过标签文本将文本字段文本放入字典 setObject 中,然后再次通过标签文本检查将文本分配给相应的文本字段..这是我的代码...
//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];
}
滚动时没有错误 table 查看...