创建一个类似于UITableViewCell的可重用UIView

时间:2012-01-23 16:31:28

标签: ios uiview

嗨!

我正在尝试创建一个可重用的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)之外,我没有任何可访问的实现可供我收集。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

这不仅仅是视图,它是您需要重新创建的整个UITableViewController。重用流程如下: 我猜,dequeueReusableCell从某个存储中获取空的重用单元格,来自NSMutableArray(从数组中获取第一个对象,然后从数组中删除它并返回它)。如果array为空,则方法返回nil。您检查单元格值,如果它为零,则创建一个新的单元格类实例。如果它不是零,则用数据填充它。 这适用于每个可见单元格,即每个可以适合屏幕的单元格。任何不可见的单元格都没有初始化。当用户滚动表时,完全离开屏幕的单元格(不是单个像素可见)发送到reuseQueue - 它们的所有子视图和值都返回默认值或只是nilled,然后单元格被添加到NSMutableArray的末尾是队列。 我希望我解释得很好。 编辑:哦,还有一件事 - 您需要为每个重用标识符使用不同的重用队列。