繁体   English   中英

自定义UITableViewCell的问题:滚动出视图出队列问题时会清除UITextFields

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM