UITableViewCell的textLabel.text被省略号部分取代

时间:2011-06-13 16:24:33

标签: iphone objective-c cocoa-touch uitableview

我有一个带有几个UITableViewcells(UITableViewCellStyleSubtitle)的UITableView。当用户点击其中一个单元格时,我会推送一个允许用户更改单元格文本的详细VC。当我弹出这个ViewController时,单元格上的文字显示为省略号:

之前:

Before editing

后: 将文本更改为“Wartyrl”并弹出详细信息VC。

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 个答案:

答案 0 :(得分:2)

创建单元格时,UILabel仅足以处理初始文本(它不会动态调整大小)。更改文本后调用[self.tableView reloadData]didChangeNameForTask方法结束)应该可以正常显示。

答案 1 :(得分:2)

您可以拨打[cell.textLabel sizeToFit]

在许多情况下,更新内部数据并致电reloadRowsAtIndexPaths:withRowAnimation:更清晰。这样你就没有那么多的东西用细胞的实现细节进行编辑(当你改变主意思考如何铺开它时)。它还可以确保您的实际数据与单元格匹配。

在大多数情况下,即使更好也是要创建一个名为UITableViewCell的{​​{1}}子类。您将其设为TaskTableViewCell,并使用KVO观察Task,管理自己的布局(包括在需要时调用Task)。这样,您不需要委托方法来告诉您何时更新。当任务更改时,单元格会自动更新。这会将所有布局问题移动到单元类中,并移出数据源。

答案 2 :(得分:1)

似乎 textLabel 在调整宽度时犹豫不决。如果它太强烈无法更改,只需使用[tableView reloadData]直接重新加载tableView。

如果您不想重新加载整个tableView,则只需重新加载下面的特定单元格。

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

当更改单元格的 textLabel 文本时,这将显示一个漂亮的淡入淡出动画。

答案 3 :(得分:1)

-(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


}