我有一个包含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;
}
我在这里做错了吗?我知道当我点击一个集合视图单元格时表格视图正在更新,但它没有检查当前打开的行并使用它来设置高度。
答案 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
类
以及表视图的作用,如果需要在类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];
}
但这会导致所有单元格重新加载,因此效率不高。