创建新单元格后执行某些操作

时间:2013-11-07 13:44:06

标签: ios uitableview uitextview

我一直试图绕着这样做,但我似乎无法找到一种优雅的方式。我尝试注入一个代码,使我的自定义UITextView中的UITableViewCell成为创建单元格后的第一响应者。

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    UITableView *tableView = self.tableView;

    switch(type) {
        case NSFetchedResultsChangeInsert:
            // store some of the cell information
            _newlyCreatedCell = @{@"path": newIndexPath, @"age":[NSDate date],@"cell":(CustomCell*)[tableView cellForRowAtIndexPath:newIndexPath]};

           [[(CustomCell*)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:newIndexPath.row-1 inSection:0]] textLabel] becomeFirstResponder];

            // highlight cell
            [tableView selectRowAtIndexPath:newIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
            [tableView deselectRowAtIndexPath:newIndexPath animated:YES];

            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

            break;
}

我得到了这个粗略的代码,但它似乎不是最好的方法或工作方法。我有一个粗略而错误的想法,即将新创建的单元格信息存储在NSDictionary中。很坏。无论如何,我开始改变newIndexPath值,因为它没有为新创建的单元格返回NSIndexPath(可能是在某处的Apple文档中写的......)。所以我将值设置为[NSIndexPath indexPathForRow:newIndexPath.row-1 inSection:0],当然希望它会返回正确的值。但那回来了(null)。没啥事儿。

有没有人知道在创建新单元格时执行一堆代码的更好且可能更简单的方法?

2 个答案:

答案 0 :(得分:1)

我自己从未尝试过,但UITableViewDelegate方法

tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

在这里可能会有所帮助。正如文档中所述:

  

表视图在使用单元格绘制行之前将此消息发送到其委托,从而允许委托在显示之前自定义单元格对象。此方法使代理有机会覆盖表视图前面设置的基于状态的属性,例如选择和背景颜色。

如果一次插入多个单元格,可能会出现问题。但是你使用NSFetchedResultsController来排序用于填充单元格的数据,所以也许你可以找出哪个单元格是“最后一个”。

答案 1 :(得分:0)

我很困惑为什么你在创建之前尝试访问单元格信息。难道你不应该试图让单元格的文本标签在创建之后成为第一响应者吗?类似的东西:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath {

UITableView *tableView = self.tableView;

switch(type) {

    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                         withRowAnimation:UITableViewRowAnimationFade];

        //Then do
       [[(CustomCell*)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:newIndexPath.row inSection:0]] textLabel] becomeFirstResponder];

        break;
}