UITableView 自定义 UIView 重复

UITableView custom UIView duplicates

因此,客户的规范希望 UITableView 始终显示其中一行,以便用户可以在 UITableView 的任何位置与这个关键按钮进行交互。一旦他滚动并看到带有按钮的实际行,浮动页脚必须消失并允许用户与 'real' 单元格交互,而不是浮动版本。

我想出了以下代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{    
    if([self isPostularmeRowVisible])
    {
        [self hidePostularmeFooterView];
    }
    else
    {
        [self showPostularmeFooterView];
    }
}

-(BOOL)isPostularmeRowVisible
{        
    NSArray *indexes = [self.tableView indexPathsForVisibleRows];
    for (NSIndexPath *index in indexes)
    {
        if (index.row == 0 && index.section>=DetalleEmpleoPostularmeCell)
        {
            return YES;
        }
    }
    return NO;
}

-(void) showPostularmeFooterView
{
    NSAssert(_state==ESTADO_POSTULACION_NO_POSTULADO, @"NJDetalleEmpleoViewController: This shouldn't happen");

    if(!self.footerView)
    {
        NJDetalleEmpleoPostularmeTableViewCell *footerView = [self.tableView dequeueReusableCellWithIdentifier:kDetalleEmpleoPostularmeCell];
        [footerView configureCell:self.detaleAviso];
        float h = self.view.frame.size.height-footerView.cellHeight;
        footerView.frame = CGRectMake(0,h,self.view.frame.size.width,footerView.cellHeight);
        footerView.delegate = self;
        self.footerView = footerView;
        [self.view addSubview:self.footerView];
        [self.view bringSubviewToFront:self.footerView];
    }
}

-(void) hidePostularmeFooterView
{
    if(self.footerView)
    {
        [self.footerView removeFromSuperview];
    }

    self.footerView = nil;
}

但是这段代码有一个我似乎无法弄清楚的错误:一旦用户在 UITextBox 上点击并输入一些文本,它就会开始表现不稳定,即:屏幕上出现 2 个或更多单元格,当出现应该是none!基本上,当我调用方法 'hidePostularmeFooterView' 时,它似乎并没有消失(只有在我输入一些文本后,如果我不与之交互,它才能正常工作)。

在我输入一些文字后,似乎有两个版本的页脚,证据如下:

将其作为单元格和页脚删除并在 UITableView 下方将其替换为自己的 UIView 并让 UITableView框架高度只下降到这个视图的 y 原点,而不是占据整个屏幕。这样您就可以随时看到视图并与之交互。有什么理由需要它成为 UITableViewCell 吗?

我不会碰 footerView,而是创建一个出现的自定义视图,如下所示:

dataSource = [NSMutableArray new];
for (int n = 0; n < 100; n++){
    [dataSource addObject:[NSString stringWithFormat:@"%i",n]];
}

table = [UITableView new];
table.frame = self.view.bounds;
table.delegate = self;
table.dataSource = self;
[self.view addSubview:table];

popUpView = [UIImageView new];
popUpView.frame = CGRectMake(0, h-200, w, 200);
popUpView.image = [UIImage imageNamed:@"Grumpy-Cat.jpg"];
popUpView.contentMode = UIViewContentModeScaleAspectFill;
popUpView.clipsToBounds = true;
popUpView.layer.borderColor = [UIColor redColor].CGColor;
popUpView.layer.borderWidth = 2.0f;
[self.view addSubview:popUpView];

像往常一样设置 tableView,在 scrollViewDidScroll 方法中,你可以像这样粘贴:

NSIndexPath * specialRow = [NSIndexPath indexPathForRow:50 inSection:0];
NSArray * indices = table.indexPathsForVisibleRows;
if ([indices containsObject:specialRow]){
    if (isShowing){
        isShowing = false;
        [UIView animateWithDuration:1.0f
                              delay:0.0f
             usingSpringWithDamping:1.0f
              initialSpringVelocity:0.8f
                            options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
                         animations:^{
                             popUpView.transform = CGAffineTransformMakeTranslation(0, popUpView.frame.size.height + 10);
                         }
                         completion:^(BOOL finished){
                         }];
    }
} else if (!isShowing) {

    isShowing = true;
    [UIView animateWithDuration:1.0f
                          delay:0.0f
         usingSpringWithDamping:1.0f
          initialSpringVelocity:0.8f
                        options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         popUpView.transform = CGAffineTransformIdentity;
                     }
                     completion:^(BOOL finished){
                     }];
}

其中 isShowing 是一个跟踪 popUpView 状态的布尔值。这是快速而肮脏的代码,应该在别处声明 specialRow 等。在本例中,它被定义为 100 行中的第 50 行。

郑重声明,我不认为具有这样的重复功能是好的设计,但是,嘿,客户最清楚 :D