#iphone #dynamic #uitableview #multiline
#iPhone #динамический #uitableview #многострочность
Вопрос:
С этим я продвинулся довольно далеко, но зависаю на той части, где я считываю информацию о строке.
Я создал ячейку, которая получает данные из внешнего XML-файла, все работает нормально, но некоторые ячейки содержат слишком много текста, который я хочу отобразить в нескольких строках. Также никаких проблем. Но самое сложное — это динамическая высота моей ячейки. Я настроил это в методе heightForRowAtIndexPath: , но мне нужно знать количество текста (строк), содержащегося в ячейке, и я застрял в той части, как подключить это к моей переменной cellText (string). Любая помощь была бы приветствована 🙂
Вот мой код:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleBlue;
}
// Set the text in the cell for the section/row.
NSString *endDate = [XMLParser stringFromDate:[XMLParser dateFromString:stage.end]];
int endDateLength = endDate.length;
NSString *endTime = [NSString stringWithFormat:@"%@", [endDate substringFromIndex:endDateLength -7]];
NSString *startDate = [XMLParser stringFromDate:[XMLParser dateFromString:stage.start]];
int startDateLength = startDate.length;
NSString *startTime = [NSString stringWithFormat:@"%@", [startDate substringFromIndex:startDateLength -7]];
NSString *date = [XMLParser stringFromDate:[XMLParser dateFromString:stage.start]];
int dateLength = date.length;
NSString *dateString = [NSString stringWithFormat:@"%@", [date substringToIndex:dateLength -7]];
NSString *cellText = nil;
NSString *cellExplainText = nil;
//Pre title arrays
dateTitleArray = [[NSArray alloc] initWithObjects:@"Dag", @"Start tijd", @"Eind tijd", nil];
nameTitleArray = [[NSArray alloc] initWithObjects:@"Naam", @"Graad",nil];
addressTitleArray = [[NSArray alloc] initWithObjects:@"Dojo", @"Straat", @"Plaats",nil];
infoTitleArray = [[NSArray alloc] initWithObjects:@"Kosten", @"Contact", @"Details", nil];
dateArray = [[NSArray alloc] initWithObjects: dateString, startTime, endTime, nil];
nameArray = [[NSArray alloc] initWithObjects: stage.teacher, stage.grade, nil];
addressArray = [[NSArray alloc] initWithObjects: stage.dojo, stage.street, stage.city, nil];
infoArray = [[NSArray alloc] initWithObjects: stage.cost, stage.contact, stage.details, nil];
switch (indexPath.section)
{
case 0:
cellExplainText = [dateTitleArray objectAtIndex:indexPath.row];
cellText = [dateArray objectAtIndex:indexPath.row];
break;
case 1:
cellExplainText = [nameTitleArray objectAtIndex:indexPath.row];
cellText = [nameArray objectAtIndex:indexPath.row];
break;
case 2:
cellExplainText = [addressTitleArray objectAtIndex:indexPath.row];
cellText = [addressArray objectAtIndex:indexPath.row];
break;
case 3:
cellExplainText = [infoTitleArray objectAtIndex:indexPath.row];
cellText = [infoArray objectAtIndex:indexPath.row];
break;
default:
break;
}
[dateTitleArray release];
[nameTitleArray release];
[addressTitleArray release];
[infoTitleArray release];
[dateArray release];
[nameArray release];
[addressArray release];
[infoArray release];
cell.textLabel.text = cellExplainText;
cell.detailTextLabel.text = cellText;
cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.detailTextLabel.numberOfLines = 0;
cell.detailTextLabel.font = [UIFont fontWithName:@"Helvetica" size:14.0];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellTextSize = ????????????;
UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:14.0];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [cellTextSize sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height 12;
}
Ответ №1:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
CGSize maxSize = CGSizeMake(urMaxSize);
CGSize cellSize = [itemName sizeWithFont:[UIFont systemFontOfSize:15]
constrainedToSize:maxSize lineBreakMode:UILineBreakModeWordWrap];
return cellSize.height;
}
itemName
это текст, которым вы хотите его заполнить. Я предполагаю, что это [infoTitleArray objectAtIndex:indexPath.row]
и соответствующая информация массива на основе индекса. Вы также можете получить раздел в этом методе, чтобы получить строку.
Если вы хотите использовать свой метод
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellText;
switch (indexPath.section)
{
case 0:
cellText = [dateTitleArray objectAtIndex:indexPath.row];
break;
case 1:
cellText = [nameTitleArray objectAtIndex:indexPath.row];
break;
case 2:
cellText = [addressTitleArray objectAtIndex:indexPath.row];
break;
case 3:
cellText = [infoTitleArray objectAtIndex:indexPath.row];
break;
default:
break;
}
UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:14.0];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height 12;
}
Комментарии:
1. Привет, спасибо за помощь до сих пор. Я реализовал код, который вы мне предоставили. Приведенный выше текстовый блок. Но динамическая высота ячейки не меняется. Я все еще вижу, что 3 строки / или более текста втискиваются в ячейку стандартного размера. При этом не учитывается количество строк. Есть предложения?
2. [код] (NSString * cellText; переключатель (indexPath.section) { случай 0: cellText = [dateTitleArray objectAtIndex:indexPath.row]; разрыв; случай 1: cellText = [nameTitleArray objectAtIndex:indexPath.row]; разрыв; случай 2: cellText = [addressTitleArray objectAtIndex:indexPath.row]; разрыв; случай 3: cellText = [infoTitleArray objectAtIndex:indexPath.row]; разрыв; по умолчанию: разрыв; } )…
3. [код] (UIFont * cellFont = [UIFont fontWithName:@»Helvetica» размер: 14.0]; CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; возвращает Размер этикетки.высота 12;)
4. Когда я выполняю проверку NSLog в функции switch, она выдает (null) для каждого случая. Каким-то образом он не может извлечь данные
5. попробуйте выделить строку и проверить. убедитесь, что вы выпустили его после того, как вам понадобится
Ответ №2:
Я бы посоветовал вам сохранить в массиве ваши cellText
/ cellTextExplained
значения, чтобы в heightForRowAtIndexPath:
вы могли их извлекать:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
NSString *cellText = [self.cellTextArray:objectAtIndex:indexPath.row];
//-- rest of your code here
UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:14.0];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [cellTextSize sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height 12;
}
Комментарии:
1. Извините, может быть, действительно вопрос новичка. Я пытаюсь поместить cellText / cellTextExplained в массив, но на данный момент у меня должен быть блок записи. Как вы предложили мне это сделать?