我正在尝试了解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
班。 XYZToDoItem
从XYZToDoSubItem
继承了Name,Completed-state和Creation-date。另外它有一个包含Subitems的Mutable数组。
我还实现了一组其他功能:
因此单击不会干扰这些功能。
我还有一个单一点击的“监听器”(不完整的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;
我希望有人能够弄清楚如何解决这个问题。
提前致谢, 亚历山大。
答案 0 :(得分:0)
我个人非常喜欢使用[tableView beginUpdates]; [tableView endUpdates];
,它给你一个非常好的动画。 : - )
该代码的问题在于它实际上并没有真正更新单元格,它不会调用cellForRowAtIndexPath
。我建议使用前面提到的代码来设置高度变化的动画,以及[tableView reloadData]
或[tableView reloadRowsAtIndexPaths:NSArray* withRowAnimation:UITableViewRowAnimation];
来更新单元格内容。
只需存储触摸的行以及调用cellForRowAtIndexPath
和heightForRowAtIndexPath
时,检查它是否在同一行并采取相应行动。
从可用性角度来看,我建议从一开始就将所有子任务放在单元格中,但将它们放在单元格框架之外。这样,当单元被触摸时,仅需要改变单元高度以显示单元框架外部的视图。这样,您就不必处理内容更改。
干杯!