gpt4 book ai didi

ios - 自定义 UITableViewCell : UITextFields clearing when scrolled out of view- dequeuing problems 的问题

转载 作者:行者123 更新时间:2023-12-01 16:40:08 25 4
gpt4 key购买 nike

我有一个带有自定义 UITableViewCell 的 UITableView,其中我有向单元格添加文本字段、图像、动画、填充等的方法。

在我的 ViewController 中,我根据需要设置单元格,以满足特定需求,例如第一个和最后一个单元格具有与 UITableView 中的其余单元格不同的图像和占位符文本。

我最初的问题是,当表格使单元格出列并重用它们时,它们的顺序被错误地更改了,但是目前我已经解决了这个问题,但现在发生的是自定义单元格中 UITextFields 中的文本被删除/重新当 tableview 滚动出 View 时排序。理想情况下,我希望用户在文本字段中输入文本,并将其永久保留在该特定单元格中。

根据我的尝试,我想我在将单元格和文本字段代表出队时遇到问题,我哪里出错了?我的文本字段编辑开始/更改/结束方法是在 SearchBarTableViewCell.m 中的正确位置调用的,还是应该在 exploreViewController.m 中?

这是我设置自定义单元格的地方,也是我的 cellForRowAtIndex 方法正在实现的地方:

SEARCHBARTABLEVIEWCELL.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}

//add search bar
self.searchBar = [[UITextField alloc]initWithFrame:CGRectMake(0, 5, 280, 40)];
self.searchBar.backgroundColor = [UIColor whiteColor];
self.searchBar.keyboardAppearance = UIKeyboardAppearanceDark;
self.searchBar.delegate = self;
self.searchBar.font = [UIFont fontWithName:@"AvenirNext-Regular" size:20.0f];
[self.searchBar setBackgroundColor:[UIColor whiteColor]];
self.searchBar.layer.cornerRadius = 8;
self.searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
[self.searchBar setAdjustsFontSizeToFitWidth:NO];
self.searchBar.textColor = [UIColor colorWithRed:73.0/255.0 green:173.0/255.0 blue:248.0/255.0 alpha:1.0];
self.searchBar.tintColor = [UIColor colorWithRed:73.0/255.0 green:173.0/255.0 blue:248.0/255.0 alpha:1.0];
self.searchBar.layer.borderWidth = 2.0f;
self.searchBar.layer.borderColor = [[UIColor colorWithRed:73.0/255.0 green:173.0/255.0 blue:248.0/255.0 alpha:1.0] CGColor];
self.searchBar.layer.cornerRadius = 8.0f;
// [self.contentView addSubview:self.searchBar];
[self.searchBar addTarget:self
action:@selector(editingChanged:)
forControlEvents:UIControlEventEditingChanged];
[self.searchBar addTarget:self
action:@selector(editingBegun:)
forControlEvents:UIControlEventEditingDidBegin];
[self.searchBar addTarget:self
action:@selector(editingEnded:)
forControlEvents:UIControlEventEditingDidEnd];

//add the left padding and the left-hand icon to the searchbar textfield
self.searchBarSpacerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 45, 20)];
_searchBarIcon = [[UIImageView alloc] initWithFrame:CGRectMake(20, 0,15, 20)];

_searchBarIcon.contentMode = UIViewContentModeScaleAspectFill;
[self.searchBarSpacerView addSubview:_searchBarIcon];
[self.searchBar setLeftViewMode:UITextFieldViewModeAlways];
_searchBarIcon.tintColor = [UIColor colorWithRed:73.0/255.0 green:173.0/255.0 blue:248.0/255.0 alpha:1.0];
[_searchBar setLeftView:self.searchBarSpacerView];
[self.searchBarSpacerView setUserInteractionEnabled:NO];

//add the far-right padding to the searchbar textfield
self.searchBarPaddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
self.searchBar.rightView = self.searchBarPaddingView;
_searchBar.rightViewMode = UITextFieldViewModeAlways;
[self.searchBarPaddingView setUserInteractionEnabled:NO];

//setup the "+" sign for the last cell in the tableview
self.addRowButton = [[UIButton alloc] initWithFrame:CGRectMake(self.searchBar.frame.size.width - 30,10, 40, 40)];
self.addRowButtonIcon = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 20, 20)];
[self.addRowButton addSubview:self.addRowButtonIcon];
[self.searchBar addSubview:self.addRowButton];

//setup the "between" and "and" text labels
self.and = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 35.5, 40)];
self.and.font = [UIFont fontWithName:@"AvenirNext-Regular" size:20.0f];
self.and.textColor = [UIColor colorWithRed:159.0/255.0 green:159.0/255.0 blue:159.0/255.0 alpha:1.0];

return self;
}

- (IBAction)editingBegun:(UITextField *)sender
{
NSLog(@"%li + %li", (long)self.rows, (long)self.tag);

[self delegate];

if (self.tag == 0) {
[UIView animateWithDuration:0.2f
delay:0.0f
options:UIViewAnimationOptionCurveEaseIn
animations:^{
self.searchBarIcon.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-90));
}completion:nil];

if (sender.text.length > 0) {

[self.and setFrame:CGRectMake(10, 0, 35.5, 40)];
[self.searchBarSpacerView setFrame:CGRectMake(0, 0, 45, 20)];
self.and.hidden = YES;

}

NSLog(@"FIRSTCELL");
}
else if(self.tag <= self.rows-2){

if (sender.text.length > 0) {

[self.and setFrame:CGRectMake(10, 0, 35.5, 40)];
[self.searchBarSpacerView setFrame:CGRectMake(0, 0, 45, 20)];
self.and.hidden = YES;

}

NSLog(@"MIDDLECELL");
}
else if(self.tag == self.rows -1 ){
[UIView animateWithDuration:0.2f
delay:0.0f
options:UIViewAnimationOptionCurveEaseIn
animations:^{
self.searchBarIcon.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90));
}completion:nil];

if (sender.text.length > 0) {

[self.and setFrame:CGRectMake(10, 0, 35.5, 40)];
[self.searchBarSpacerView setFrame:CGRectMake(0, 0, 45, 20)];
self.and.hidden = YES;

}

NSLog(@"LASTCELL");
}
}

- (IBAction)editingChanged:(UITextField *)sender
{

[self delegate];

// NSLog(@"Editing...");
}

- (IBAction)editingEnded:(UITextField *)sender
{

[self delegate];

NSLog(@"Editing ended");

[UIView animateWithDuration:0.2f
delay:0.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.searchBarIcon.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0));
}completion:nil];

NSString *rawString = [sender text];
NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSString *trimmed = [rawString stringByTrimmingCharactersInSet:whitespace];
if ([trimmed length] != 0) {
// Text was NOT empty or only whitespace.

if (sender.text.length > 0) {
NSLog(@" and in the new textField");

if (self.tag == 0){

[sender addSubview:self.and];

self.and.hidden = NO;
[UIView animateWithDuration:0.2f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut
animations:^{

[self.between setFrame:CGRectMake(45, 0, 80, 40)];

[self.searchBarSpacerView setFrame:CGRectMake(0, 0, 45+self.between.frame.size.width+4, 20)];

}completion:nil];

} else if (self.tag > 0) {

[sender addSubview:self.and];
self.and.hidden = NO;

[UIView animateWithDuration:0.2f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut
animations:^{

[self.and setFrame:CGRectMake(45, 0, 35.5, 40)];

[self.searchBarSpacerView setFrame:CGRectMake(0, 0, 45+self.and.frame.size.width+4, 20)];

}completion:nil];
self.addRowButton.hidden = NO;

//set the padding view to accommodate the "+" button
[self.searchBarPaddingView setFrame:CGRectMake(0, 0, 30, 20)];
NSLog(@"%f",self.searchBarPaddingView.frame.size.width);
}
}
} else{
NSLog(@"There are only blank spaces in this search box!");
sender.text = @"";
self.addRowButton.hidden = YES;
[self.searchBarPaddingView setFrame:CGRectMake(0, 0, 5, 20)];
}
}

@end

探索 Controller .M
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"searchCell";

SearchBarTableViewCell *cell = [self.searchTable dequeueReusableCellWithIdentifier:cellIdentifier];

if (!cell) {
cell = [[SearchBarTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

if (indexPath.row == 0) {
cell.searchBarIcon.image = [[UIImage imageNamed:@"firstCell"]imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
cell.searchBar.placeholder = @"Search between here...";
cell.and.text = @"Between";


} else if (indexPath.row == self.cells.count-1) {
cell.searchBarIcon.image = [[UIImage imageNamed:@"lastCell"]imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
cell.and.text = @"and";


cell.searchBar.placeholder = @"...and here";
[cell.addRowButtonIcon setImage:[UIImage imageNamed:@"addRow"]];
cell.addRowButton.hidden = YES;
[cell.addRowButton addTarget:self action:@selector(insertRowsAtIndexPaths:withRowAnimation:) forControlEvents:UIControlEventTouchUpInside];

} else {
cell.and.text = @"and";

cell.searchBarIcon.image = [[UIImage imageNamed:@"anyCell"]imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
cell.searchBar.placeholder = @"...and here";
[cell.searchBarIcon setFrame:CGRectMake(20, 2.5,15, 15)];

}


// Add utility buttons
NSMutableArray *rightUtilityButtons = [NSMutableArray new];

[rightUtilityButtons sw_addUtilityButtonWithColor:[UIColor clearColor] icon:[UIImage imageNamed:@"myLocation"]];
[rightUtilityButtons sw_addUtilityButtonWithColor:[UIColor clearColor] icon:[UIImage imageNamed:@"deleteCell"]];

[cell.contentView addSubview:cell.searchBar];

cell.searchBar.tag = indexPath.row;
cell.rightUtilityButtons = rightUtilityButtons;
cell.tag = indexPath.row;
cell.rows = self.cells.count;
cell.selectionStyle = UITableViewCellSelectionStyleNone;

NSLog(@"textfield tag %ld", (long)cell.searchBar.tag);

return cell;
}

最佳答案

为了避免丢失每个单元格的值,通常的做法是创建一个数组并将每个单元格的值存储到数组中。所以数组将具有全局范围,最好将它声明为您的类的全局变量(EXPLOREVIEWCONTROLLER)。在 ExploreViewController.m 中,就在 @implementation 之前,添加以下内容以完成此操作:

@interface ExploreViewController ()
{
NSMutableArray *array;
}

@end

现在,请务必在使用之前在类中的某处初始化数组。通常的做法是将此添加到您类(class)的 init方法。
array = [[NSMutableArray alloc] init];

现在在 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath您可以使用 [array insertObject: textField.text atIndex: indexPath.row]; 存储每个文本字段的值. cellForRowAtIndexPath: 中遵循的简单逻辑在处理存储值时要遵循的是首先检查数组(表示您的 uitableView 行)是否有任何值,如果有,则使用该数据填充您的字段。其基本代码表示为:
if ([array count] > 0) {
NSString *textFieldText = [[NSString alloc] init];
// Will retrieve text from array with the same index as the cell
textFieldText = [array objectAtIndex: indexPath.row];
}
textFieldText 的值现在可以添加到单元格的 textField 中。

关于ios - 自定义 UITableViewCell : UITextFields clearing when scrolled out of view- dequeuing problems 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com