我在表格单元格中嵌入了水平表格视图(脉冲读取器)。我得到的有趣行为是dequeueReusableCellWithIdentifier:
似乎正确地记住了嵌入式表视图的偏移,而我没有做任何事情。但是有两种口味可以“记住”
首先(预期)
我创建了一个包含100个部分的表,每个部分有1行。每个单元格(每个部分)都有一个嵌入式表格视图,我强制它有100行和1个部分。当我滚动垂直表格视图时,将重复使用单元格(通过查看dequeueReusableCellWithIdentifier:
之后的单元格的实例名称进行检查
VerticalTableViewCell *cell = (VerticalTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
如果我将第一个表格视图单元格的嵌入表格视图向右滚动,比如说10.5个单元格,当我在垂直表格视图中向下滚动几个单元格时,重用的表格单元格的嵌入表格视图会被这些10.5个单元格偏移。这是有道理的,细胞只是重复使用,我没有重置任何偏移。假设重复使用的单元格是第7行。如果我现在滑动第7行的嵌入式表视图(这是与第一行相同的嵌入式表视图,由于重用)到位置20,当我转到嵌入式表视图的垂直表视图的顶部(我有最初移到10.5),现在是20.再次,预计,那些表格单元格是相同的。刚重用。
第二(希望,但不知道它是如何运作的)
现在我填写我的真实数据(而不仅仅是打印
[cell.textLabel setText:[NSString stringWithFormat: @"here: %d", indexPath.row]];
到细胞。
现在,突然间,我的嵌入式表格视图 DO 会记住它们的位置。我再次确保细胞被重复使用(与上述方法相同)。但是这次,当我滚动第一个嵌入式表格视图(到10.5位置)并向下滚动到第七行时,第七行是它的起始点。当我将第一行滚动回到视图中时,它就在我离开它的位置。
这是使用Xcode 4.2和iOS 5.0。 dequeueReusableCellWithIdentifier:
有什么聪明之处吗?
在旧学校(iOS 5.0之前),我会检查
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
}
看看发生了什么的逻辑,但使用StoryBoards则不再需要。
表现不同的2个示例项目有点大,但如果您有任何相关代码,请告诉我。
很抱歉这么模糊,我只想弄清楚这些表格视图的内存管理是怎么回事。
所有连接都是通过IBOutlets进行的,并在StoryBoard中进行。
谢谢!
第一个垂直表视图控制器
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//#warning Potentially incomplete method implementation.
// Return the number of sections.
return 100;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//#warning Incomplete method implementation.
// Return the number of rows in the section.
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"PlayerCell";
PlayerCell *cell = (PlayerCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
cell.games = [NSMutableArray arrayWithCapacity:1];
if(indexPath.section <40){
//[cell.textLabel setText:[NSString stringWithFormat:@"h343: %d", indexPath.section]];
}
CGAffineTransform rotateTable = CGAffineTransformMakeRotation(-M_PI_2);
cell.htv.transform = rotateTable;
cell.htv.frame = CGRectMake(0, 0, 320, 120);
return cell;
}
第一个水平表视图代理/数据源
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return 100;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
CGAffineTransform rotateImage = CGAffineTransformMakeRotation(M_PI_2);
cell.transform = rotateImage;
//[cell.myLabel setText:[NSString stringWithFormat:@"%d", indexPath.row]];
[cell.textLabel setText:[NSString stringWithFormat: @"here: %d", indexPath.row]];
return cell;
}
第二个垂直表视图控制器
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return [self.leagues count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"VerticalTableViewCell";
VerticalTableViewCell *cell = (VerticalTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSLog(@"Cell: %@ for index: %d", cell, indexPath.section);
cell.games = [self.leagues objectAtIndex:indexPath.section];
CGAffineTransform rotateTable = CGAffineTransformMakeRotation(-M_PI_2);
cell.horizontalTableView.transform = rotateTable;
cell.horizontalTableView.frame = CGRectMake(0, 0, 320, 120);
// Configure the cell...
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.section = indexPath.section;
return cell;
}
第二个水平表视图代理/数据源
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [self.games count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"HorizontalTableViewCell";
//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
GameTableCell *cell = (GameTableCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
CGAffineTransform rotateImage = CGAffineTransformMakeRotation(M_PI_2);
cell.transform = rotateImage;
//[cell.myLabel setText:[NSString stringWithFormat:@"%d", indexPath.row]];
NSDictionary *game = [self.games objectAtIndex:indexPath.row];
[cell.homeTeamLogo setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@",[game objectForKey:@"LogoImage_HomeTeam"]]]];
[cell.visitingTeamLogo setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@",[game objectForKey:@"LogoImage_VisitingTeam"]]]];
[cell.homeTeamName setText:[NSString stringWithFormat:@"%@", [game objectForKey:@"AbbreviatedName_HomeTeam"]]];
[cell.visitingTeamName setText:[NSString stringWithFormat:@"%@", [game objectForKey:@"AbbreviatedName_VisitingTeam"]]];
NSDictionary *gameTime = [game objectForKey:@"GameTime"];
NSString *minutes = [NSString stringWithFormat:@"%@", [gameTime objectForKey:@"Minutes"]];
if([minutes length]==1){
minutes = @"00";
}
NSString *timeOfGame = [NSString stringWithFormat:@"%@:%@",[gameTime objectForKey:@"Hours"], minutes];
[cell.gameTime setText:timeOfGame];
return cell;
}
答案 0 :(得分:0)
我的错。
我正在保存嵌入式表格视图的状态。
仅供参考:我使用的是tableView.contentOffset(如果以后有人需要这样做的话)。
糟糕。