![](/img/trans.png)
[英]UITableViewCell is choppy when scrolled for Custom Table View Cell
[英]Issue with custom UITableViewCell: UITextFields clearing when scrolled out of view- dequeuing problems
我有一个带有自定义UITableViewCell的UITableView,其中有一些用于向该单元格添加文本字段,图像,动画,填充等的方法。
在ViewController中,我根据需要设置了单元格,以满足特定的需求,例如第一个和最后一个单元格与UITableView中的其余单元格具有不同的图像和占位符文本。
我最初的问题是,当表将单元出队并重新使用它们时,它们的顺序被错误地更改了,但是目前我已经解决了该问题,但是现在发生的是,自定义单元格中的UITextFields中的文本已删除/重新将tableview滚动到视图外时排序。 理想情况下,我希望用户在文本字段中输入文本,并将其永久保留在该特定单元格中。
根据我的尝试,我想我的单元格和文本字段委托出队时遇到了问题,我在哪里出错? 是在SearchBarTableViewCell.m中的正确位置调用了我的文本框编辑开始/更改/结束方法,还是应该在explorerViewController.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
EXPLOREVIEWCONTROLLER.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
现在,请确保在使用类之前在类中的某个位置初始化该数组。 常见的做法是将其添加到类的init
方法中。
array = [[NSMutableArray alloc] init];
现在在(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
您可以使用[array insertObject: textField.text atIndex: indexPath.row];
存储每个textField的值[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中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.