点击按钮时折叠表格行

时间:2015-04-10 09:53:57

标签: ios objective-c xcode uitableview

我有一个包含3行的表格视图。当点击其中一行时,行高度会扩展以显示其中包含3个单元格的UICollectionView。

我想要在点击其中一个集合视图单元格时再次减小行的高度。这就是我的尝试:

// customCell.m

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    ProductViewController *productView = [[ProductViewController alloc]init];
    [productView collapseRow];
}

// ProductViewController.m

@property NSIndexPath *selectedRow;

- (void)collapseRow {
    menuCell *cell = (menuCell *)[self.tableView cellForRowAtIndexPath:self.selectedRow];
    [self.tableView beginUpdates];
    self.selectedRow = nil;
    [self.tableView endUpdates];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView beginUpdates];
    if ([indexPath compare:self.selectedRow] == NSOrderedSame) {
        self.selectedRow = nil;
    } else {
        self.selectedRow = indexPath;
    }
    [tableView endUpdates];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; {
    if ([indexPath compare:self.selectedRow] == NSOrderedSame)
        return 105;
    else 
        return 50;
}

我在这里做错了吗?我知道当我点击一个集合视图单元格时表格视图正在更新,但它没有检查当前打开的行并使用它来设置高度。

4 个答案:

答案 0 :(得分:1)

您也可以使用

- (void)collapseRow 
{
    NSArray* indexArray = [NSArray arrayWithObjects:self.selectedRow, nil];
    self.selectedRow = nil;
    [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationNone];
}

答案 1 :(得分:1)

我认为你的实际问题在于这个方法

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    ProductViewController *productView = [[ProductViewController alloc]init];
    [productView collapseRow];
}

在上面的方法中,您正在使用ProductViewController创建ProductViewController *productView = [[ProductViewController alloc]init];的新实例,这将调用collapseRow,但因为它不在上一个{{1}的实例上} class所以前一个实例中包含的表的行不会被折叠。

在上面的方法中,您应该使用委托模式,在为集合视图创建单元格时,而不是在单元格创建期间,只需传递ProductViewController实例的引用(使用委托),并且在选择任何集合视图单元格时,只需使用相同的委托(包含ProductViewController实例的引用)就可以在正确的类上调用collapseRow方法,而不是分配新的方法。

答案 2 :(得分:1)

我们拥有ViewController(ProductViewController)的东西,包含UITableView的实例,表视图的单元格是在CustomCell类中创建的。

1)由于ProductViewController的实例为UITableView,因此使用该实例ProductViewController可以调用UITableView及其单元格上的方法。

2)另外,在创建表视图时,我们将tableview的delegate和dataSource设置为

tableView.delegate = self;
tableView.dataSource = self;

self只不过是创建表视图的类的引用(在你的情况下是ProductViewController

ProductViewController

中实现tableView的委托和dataSource方法

以及表视图的作用,如果需要在类ProductViewController'实例上调用方法,它会使用其委托和dataSource属性中包含的引用,这只是{{1}的引用}。因此,通过表视图使用delegate / dataSource调用方法将执行ProductViewController中的方法(如果方法存在)。

3)现在,您已经创建了一个名为ProductViewController的类,使用该类创建自定义单元格并添加到表视图中,该表可以调用单元格实例上的方法,但如果您需要相反的方法(单元调用表视图的方法或CustomCell的实例,你不能这样做,因为单元格不知道ProductViewController的引用/地址),所以在实例上调用方法包含表视图和单元格的ProductViewController,单元格应该知道ProductViewController的地址。为了向单元格提供ProductViewController的引用/地址,我们使用UITableView在上述2点中使用的委托概念。

您可以使用以下委托模式实现来满足第3点的要求 -

ProductViewController类中,将委托声明为

CustomCell.h
@protocol CustomCellDelegate; @interface CustomCell : UITableViewCell { //declare member variables ... id<CustomCellDelegate> cellDelegate; } ... @property (nonatomic, assign) id<CustomCellDelegate> cellDelegate; ... // method declarations @end @protocol CustomCellDelegate <NSObject> - (void)collapseRow; @end

中的

CustomCell.m

此外,采用#import "CustomCell.h" @implementation CustomCell @synthesize cellDelegate = _ cellDelegate; - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { // Initialization code } return self; } // methods to create cells // methods to create collection view and it's items // collection view item selection handler - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { // using delegate will call the method collapseRow in ProductViewController [self. cellDelegate collapseRow]; } @end 中的委托作为

ProductViewController.h

并进入#import "CustomCell.h" @interface ProductViewController:UIViewController < CustomCellDelegate >

当您将单元格创建为

ProductViewController.m

答案 3 :(得分:0)

这应该有效:

- (void)collapseRow {
    NSIndexPath *selectedRow = self.selectedRow;
    [self.tableView beginUpdates];
    self.selectedRow = nil;
    [self.tableView reloadRowsAtIndexPaths:@[selectedRow] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];
}

或者你可以简单地说:

- (void)collapseRow {
    self.selectedRow = nil;
    [self.tableview reloadData];
}

但这会导致所有单元格重新加载,因此效率不高。