检测第二个tableview单元何时进入视图 - 然后执行操作

时间:2015-06-29 15:39:00

标签: ios objective-c uitableview

我在UITableView中有一个UIViewController,还有一个过滤按钮。当用户开始向下滚动列表时,我隐藏了过滤器按钮。我想在第二个单元格(index 1)可见时显示过滤器按钮。但是,我无法获得这种想要的效果,我只能在它到达顶部时才会出现。这是我的代码,当它到达顶部时(我再次显示过滤器按钮)。

//determines when the tableview was scrolled
-(void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint currentOffset = scrollView.contentOffset;
     //tableview is scrolled down
    if (currentOffset.y > self.lastContentOffset.y)
      {

    //if the showFilter button is visible i.e alpha is greater than 0
        if (self.showFilter.alpha==1.0) {

            [UIView animateWithDuration:1 animations:^{

                //hide show filter button
                self.showFilter.alpha=0.0;
                //I also adjust the frames of a tableview here
            }];

        }


    }


    //determines if it is scrolled back to the top
    if (self.showFilter.alpha==0.0 && currentOffset.y==0) {
        [UIView animateWithDuration:0.3 animations:^{
            //show filter button
            self.showFilter.alpha=1.0;

          //i also adjust the frames of the tableview here
        }];
    }

    self.lastContentOffset = currentOffset;
}

我也尝试过:

if (self.showFilter.alpha==0.0 && currentOffset.y<160)

但是当桌面视图跳出屏幕时,它无法达到预期的效果。还有另一种方法可以达到预期的效果吗?

1 个答案:

答案 0 :(得分:3)

之前的回答建议您应在每次表格视图滚动时检查单元格是否可见(在scrollViewDidScroll:中)。但是,你不应该这样做。这种方法可能会影响表视图的性能,因为每次表视图滚动时都必须执行检查。

相反,您只需要通过实施此UITableViewDelegate方法每次检查新单元格时进行检查:

- (void)tableView:(nonnull UITableView *)tableView willDisplayCell:(nonnull UITableViewCell *)cell forRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
    if ([indexPath isEqual:[NSIndexPath indexPathForRow:1 inSection:0]]) {
        // perform action
    }
}

在Swift 3之前,你会写下以下内容:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if indexPath == NSIndexPath(forRow: 1, inSection: 0) {
        // perform action
    }
}

在Swift 3或更高版本中,您可以编写以下内容:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath == IndexPath(row: 1, section: 0) {
        // perform action
    }
}

在任何一种情况下,请不要忘记将UIViewController子类设置为delegate的{​​{1}}。