2014-02-12 27 views
0

我想了解iOS开发,并遵循Apple自己的教程来制作待办事项列表。在教程后,他们建议我继续构建应用程序,实现更多功能等等。点击展开并在UITableViewCell中显示更多文本

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

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

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

我有一个XYZToDoSubItem类和XYZToDoItem类:

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

挖掘时,打开这个。 XYZToDoItemXYZToDoSubItem继承名称,完成状态和创建日期。另外它有一个包含子项目的可变数组。

我也实施一组的其它功能:

  1. 当用户“拥有”细胞进入编辑模式
  2. 当用户双抽头的细胞,将其设置完成状态为YES和添加复选标记

所以单击不能干扰这些功能。

我也有一个水龙头一个“监听器”(未完成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 s,然后调用[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; 

我希望有人能够找出如何解决这个问题。

在此先感谢, 亚历山大。

回答

0

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

该代码的问题是,它实际上并不实际更新单元格,它不会调用cellForRowAtIndexPath。我会建议使用前面提到的代码来动画更改高度,并与[tableView reloadData][tableView reloadRowsAtIndexPaths:NSArray* withRowAnimation:UITableViewRowAnimation];一起更新单元格内容。

简单地存储哪一行被触摸,当cellForRowAtIndexPathheightForRowAtIndexPath被调用,检查它是否是相同的行,并相应地采取行动。

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

干杯!

相关问题