UITableViewCell textLabel.text частично заменяется многоточием - PullRequest
2 голосов
/ 13 июня 2011

У меня есть UITableView с несколькими UITableViewcells (UITableViewCellStyleSubtitle). Когда пользователь нажимает на одну из ячеек, я нажимаю подробный VC, который позволяет пользователю изменить текст ячейки. Когда я открываю этот ViewController, текст в ячейке отображается с многоточием:

До:

Before editing

После того, как: После изменения текста на «Wartyrl» и выскакивания детали ВК.

After editing

Если я коснусь любой другой ячейки, многоточие исчезнет и отобразится правильный текст. Что может быть причиной этого?

Это код, который изменяет текст ячейки (с помощью метода делегата):

#pragma mark - FRREditTaskViewControllerDelegate
-(void) editTaskViewController:(FRREditTaskViewController *)sender 
          didChangeNameForTask:(FRRFlatTask *)aTask{
    NSIndexPath *idx = [NSIndexPath indexPathForRow:[self.pendings indexOfObject:aTask] inSection:0];
    [self.tableView cellForRowAtIndexPath:idx].textLabel.text = aTask.name;
}

Кстати, этот код называется перед тем, как отобразить подробный VC, а UITableViewController все еще скрыт . Я не знаю, относится ли это к делу.

Ответы [ 4 ]

2 голосов
/ 13 июня 2011

Вы можете позвонить [cell.textLabel sizeToFit].

Во многих случаях удобнее обновить внутренние данные и вызвать reloadRowsAtIndexPaths:withRowAnimation:. Таким образом, у вас не так уж много деталей, связанных с деталями реализации ячейки (когда вы передумаете, как ее расположить). Это также гарантирует, что ваши реальные данные соответствуют ячейке.

Даже лучше в большинстве случаев заключается в создании подкласса UITableViewCell с именем TaskTableViewCell. Вы вручаете ему Task, и он наблюдает за Task с KVO, управляя своим собственным макетом (включая вызов sizeToFit при необходимости). Таким образом, вам не нужны методы делегата, чтобы сообщить вам, когда он обновится. Когда задача изменяется, ячейка автоматически обновляется. Это перемещает все проблемы с компоновкой в ​​класс ячеек и из источника данных.

2 голосов
/ 13 июня 2011

Когда ячейка создана, UILabel достаточно велика только для обработки исходного текста (динамическое изменение размера не происходит).Вызов [self.tableView reloadData] после изменения текста (конец метода didChangeNameForTask) должен заставить его правильно отображаться.

1 голос
/ 13 июня 2011
-(void) editTaskViewController:(FRREditTaskViewController *)sender 
      didChangeNameForTask:(FRRFlatTask *)aTask{

    NSIndexPath *idx = [NSIndexPath indexPathForRow:[self.pendings indexOfObject:aTask] inSection:0];


    UITableViewCell *thiscell=[self.tableView cellForRowAtIndexPath:idx];

    thiscell.textLabel.text =[nsstring stringwithFormat:@"%@",aTask.name];

    [self.tableView reloadRowsAtIndexPaths: [NSArray arrayWithObject:idx] withRowAnimation:NO];//if u dont want to use reload data then use like this or use

    //- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation


}
1 голос
/ 13 июня 2011

Кажется, что textLabel колеблется, чтобы изменить его ширину. Если его слишком трудно изменить, просто перезагрузите tableView, используя [tableView reloadData].

Если вы не хотите перезагружать весь tableView, вы можете перезагрузить только определенную ячейку, как показано ниже.

NSIndexPath *idx = [NSIndexPath indexPathForRow:[self.pendings indexOfObject:aTask] inSection:0];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:idx] withRowAnimation:UITableViewRowAnimationFade];

Это покажет хорошую анимацию затухания при изменении текста ячейки textLabel.

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