单击时在UITableViewCell中展开并显示更多文本

时间:2014-02-12 19:30:58

标签: ios objective-c uitableview

我正在尝试了解iOS开发,并遵循Apple自己制作待办事项列表的教程。在教程之后,他们建议我继续构建应用程序,实现更多功能等等。

我想要实现的是当用户点击一个单元格时,它会扩展并显示额外的内容。例如:

Buy groceries   <- "item1"
Do homework     <- "item2"
Go for a jog    <- "item3"

点击时变成这个:

Buy groceries   <- "item1"
    Buy apples  <- "subitem1"
    Buy bread   <- "subitem2"
    Buy milk    <- "subitem3"

Do homework     <- "item2"
Go for a jog    <- "item3"

现在我有一个XYZToDoSubItem班和一个XYZToDoItem班。 XYZToDoItemXYZToDoSubItem继承了Name,Completed-state和Creation-date。另外它有一个包含Subitems的Mutable数组。

我还实现了一组其他功能:

  1. 当用户“持有”一个单元格时,它进入编辑模式
  2. 当用户双击一个单元格时,它将完成状态设置为YES并添加复选标记
  3. 因此单击不会干扰这些功能。

    我还有一个单一点击的“监听器”(不完整的viewDidLoad功能):

    -(void) viewDidLoad {
        UITapGestureRecognizer *stp = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
        stp.numberOfTapsRequired = 1;
        stp.numberOfTouchesRequired = 1;
        [stp requireGestureRecognizerToFail:dtp];
        [self.tableView addGestureRecognizer:stp];
    }
    

    dtp是双击识别器。

    我的handleSingleTap函数如下所示:

    - (void)handleSingleTap:(UITapGestureRecognizer *)gestureRecognizer {
        CGPoint p = [gestureRecognizer locationInView:self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
    
        if(indexPath != nil) {
            //Add contents to cell and update height here
    }
    

    }

    基本上它是如何工作的,当用户点击一个单元格(并且不再继续点击它(没有双击))时,handleSingleTap会运行。在这里,我们得到了被点击的单元格的indexPath,如果这不是nil(这意味着单元格被点击,而不是背景),我想向单元格添加更多内容并更新高度。

    我将如何继续这样做?

    是否可以将内容添加为多个subtitle,然后调用[self.tableView realoadData][self.tableView beginUpdates][self.tableView endUpdates],iOS会自行调整大小?如果是这种情况,我该如何添加数据?我将如何调用resize方法?如果没有,插入数据后如何手动调整单元格大小?

    我的设置如下:

    In the ViewController class:
    @property NSMutableArray *toDoItems;
    
    In the ToDoItem class (inherits from subitem):
    @property NSMutableArray *toDoSubItems;
    
    In the SubItem class:
    @property NSString *itemName;
    @property BOOL completed;
    @property (readonly) NSDate *creationDate;
    

    我希望有人能够弄清楚如何解决这个问题。

    提前致谢, 亚历山大。

1 个答案:

答案 0 :(得分:0)

我个人非常喜欢使用[tableView beginUpdates]; [tableView endUpdates];,它给你一个非常好的动画。 : - )

该代码的问题在于它实际上并没有真正更新单元格,它不会调用cellForRowAtIndexPath。我建议使用前面提到的代码来设置高度变化的动画,以及[tableView reloadData][tableView reloadRowsAtIndexPaths:NSArray* withRowAnimation:UITableViewRowAnimation];来更新单元格内容。

只需存储触摸的行以及调用cellForRowAtIndexPathheightForRowAtIndexPath时,检查它是否在同一行并采取相应行动。

从可用性角度来看,我建议从一开始就将所有子任务放在单元格中,但将它们放在单元格框架之外。这样,当单元被触摸时,仅需要改变单元高度以显示单元框架外部的视图。这样,您就不必处理内容更改。

干杯!