我有一个带有自定义UITableViewCell的UITableView,其中我有方法为单元格添加文本字段,图像,动画,填充等。
在我的ViewController中,我根据需要设置单元格,以满足特定需求,例如第一个和最后一个单元格具有与UITableView中其他单元格不同的图像和占位符文本。
我最初的问题是,当桌子出列并重新使用它们时,它们的顺序被错误地更改了,但是目前我已经解决了这个问题,但现在发生的是自定义单元格中UITextFields中的文本当tableview滚动到视图外时被删除/重新排序。理想情况下,我希望用户在文本字段中输入文本,并永久保留在该特定单元格中。
从我尝试的内容来看,我想我的单元格和文本区域代表出了问题,我哪里出错了?我的textfield editingbegun / changed / ends方法是在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
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;
}
答案 0 :(得分:0)
为了避免丢失每个单元格的值,通常的做法是创建一个数组并将每个单元格的值存储到数组中。因此数组将具有全局范围,最好将它声明为您的类的全局变量(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的值。在处理存储值时要遵循的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中。