Я встроил горизонтальные табличные представления внутри ячеек таблицы (ala Pulse Reader). Интересное поведение, которое я получаю, заключается в том, что 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;
}