嗨!
我正在尝试创建一个可重用的UIView(出于各种原因),类似于UITableViewController中使用的UITableViewCell实现。我想在UIScrollView中使用可重用的视图,所以我知道我不是想要实现一些完全无法实现的东西。
默认的实现是:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//declare cell identifier
static NSString *cellIdentifier = @"cell_identifier";
//dequeue cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
//check cell is valid
if(cell == nil)
{
//create a new cell
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
//
//return cell
return cell;
}
由此,值得注意的是,该单元格已从UITableView中出列。如果单元格无效,则创建新单元格。我的问题是,这个单元如何变为“排队”以便以后再次使用?
我目前的尝试实现如下:
- (TestScrollViewCell *)scrollView:(TestScrollView *)_scrollView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//declare cell identifier
static NSString *cellIdentifier = @"cell_identifier";
//dequeue cell
TestScrollViewCell *cell = (TestScrollViewCell *)[scrollView dequeueReusableCellWithIdentifier:cellIdentifier];
//check cell is valid
if(cell == nil)
{
//create a new cell
cell = [[TestScrollViewCell alloc] initWithFrame:CGRectZero];
}
//
//return cell
return cell;
}
我认为在我的TestScrollView中添加一个NSMutableDictionary来存储cellIdentifier和TestScrollViewCell(UIView),然后根据字典键将它们拔出来将是一个好的开始,但这真的是“可重用”的真正实现“ 细胞?
我可以看到的问题是,我会将UIView添加到基于框架定位的ScrollView。在这种意义上对视图进行Dequeing将不允许我将视图添加到滚动视图而不影响第一个视图(通过修改框架)但肯定这是UITableViewCells的工作方式,以及节页眉/页脚?
我一直在关注this implementation,它似乎遵循我打算实施的相同路线,但我并非100%销售,这是可重用单元的真正实现。
以前有人有运气吗?我试图在这个问题上取得Apple的领先优势,但除了UITableViewCell和MKAnnotationView(MapKit)之外,我没有任何可访问的实现可供我收集。
非常感谢任何帮助。
答案 0 :(得分:3)
这不仅仅是视图,它是您需要重新创建的整个UITableViewController。重用流程如下:
我猜,dequeueReusableCell
从某个存储中获取空的重用单元格,来自NSMutableArray(从数组中获取第一个对象,然后从数组中删除它并返回它)。如果array为空,则方法返回nil。您检查单元格值,如果它为零,则创建一个新的单元格类实例。如果它不是零,则用数据填充它。
这适用于每个可见单元格,即每个可以适合屏幕的单元格。任何不可见的单元格都没有初始化。当用户滚动表时,完全离开屏幕的单元格(不是单个像素可见)发送到reuseQueue - 它们的所有子视图和值都返回默认值或只是nilled,然后单元格被添加到NSMutableArray的末尾是队列。
我希望我解释得很好。
编辑:哦,还有一件事 - 您需要为每个重用标识符使用不同的重用队列。