dequeueReusableCellWithIdentifier: запоминание состояния ячейки - PullRequest
0 голосов
/ 18 октября 2011

Я встроил горизонтальные табличные представления внутри ячеек таблицы (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;
}

1 Ответ

0 голосов
/ 18 октября 2011

Моя вина.

Я сохранял состояние встроенного табличного представления.

К вашему сведению: я использовал tableView.contentOffset (на случай, если кому-то понадобится сделать это позже).

Упс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...