问题描述
||
我有一个带有几个UITableViewcells(UITableViewCellStyleSubtitle)的UITableView。当用户点击一个单元格时,我按下了一个细节VC,该VC允许用户更改单元格的文本。当我弹出此ViewController时,单元格上的文本以省略号出现缩写:
之前:
后:
将文本更改为\“ Wartyrl \”,然后弹出详细信息VC。
如果我点击其他任何单元格,则省略号消失,并显示正确的文本。是什么原因造成的?
这是更改单元格文本的代码(通过委托方法):
#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时,将调用此代码。我不知道这是否相关。
解决方法
似乎textLabel犹豫是否要调整其宽度。如果太坚决不能更改,只需使用using1直接重新加载tableView。
如果您不想重新加载整个tableView,则可以仅重新加载特定的单元格,如下所示。
NSIndexPath *idx = [NSIndexPath indexPathForRow:[self.pendings indexOfObject:aTask] inSection:0];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:idx] withRowAnimation:UITableViewRowAnimationFade];
更改单元格的textLabel的文本时,这将显示漂亮的淡入淡出动画。
, 创建单元格时,UILabel的大小仅足以处理初始文本(它不会动态调整大小)。更改文本后(didChangeNameForTask
方法的结尾)调用[self.tableView reloadData]
应使其正确显示。
, 您可以叫[cell.textLabel sizeToFit]
。
在许多情况下,更新内部数据并致电reloadRowsAtIndexPaths:withRowAnimation:
更干净。这样一来,您就不会有太多的内容困扰着单元的实现细节(当您改变主意如何布局时)。它还可以确保您的真实数据与单元格匹配。
在大多数情况下,更好的方法是创建一个名为TaskTableViewCell
的UITableViewCell
子类。您将其交给Task
,它会用KVO观察Task
,管理自己的布局(包括在需要时调用sizeToFit
)。这样,您就不需要委托方法来告诉您何时更新。任务更改时,单元会自动更新。这会将所有布局问题移到单元类中,并移出数据源。
, -(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
}