DTGridView在滚动时丢失内容

时间:2010-04-28 19:39:04

标签: iphone objective-c cocoa-touch dtgridview

我正在使用Daniel Tull的DTKit中的DTGridView。我在一个非常简单的ViewController中实现了它,我正在做的测试是在网格的最后一行放置一个按钮,它应该向网格添加另一行(并因此将按钮移动到它下面的一行)。

问题是,当我单击按钮几次然后开始滚动时,网格似乎丢失了它的内容。由于我不完全确定这是网格中的错误,但在我的代码中更多,我希望你们可以帮助我并追踪错误。

首先我有我的头文件,这很简单,因为这是一个测试:

#import <UIKit/UIKit.h>
#import "DTGridView.h"

@interface TestController : UIViewController <DTGridViewDelegate, DTGridViewDataSource> 
{
    DTGridView*     thumbGrid;
}

@end

我声明了一个DTGridView,它将是我的网格,我想放入内容。

现在,我的代码文件:

#import "TestController.h"

@implementation TestController

int rows = 1;

- (NSInteger)numberOfRowsInGridView:(DTGridView *)gridView
{
    return rows;
}

- (NSInteger)numberOfColumnsInGridView:(DTGridView *)gridView forRowWithIndex:(NSInteger)index
{
    if (index == rows - 1)
        return 1;
    else
        return 3;
}

- (CGFloat)gridView:(DTGridView *)gridView heightForRow:(NSInteger)rowIndex
{
    return 57.0f;
}

- (CGFloat)gridView:(DTGridView *)gridView widthForCellAtRow:(NSInteger)rowIndex column:(NSInteger)columnIndex
{
    if (rowIndex == rows - 1)
        return 320.0f;
    else
        return 106.6f;
}

- (DTGridViewCell *)gridView:(DTGridView *)gridView viewForRow:(NSInteger)rowIndex column:(NSInteger)columnIndex
{
    DTGridViewCell *view = [[gridView dequeueReusableCellWithIdentifier:@"thumbcell"] retain];

    if (!view)
        view = [[DTGridViewCell alloc] initWithReuseIdentifier:@"thumbcell"];

    if (rowIndex == rows - 1)
    {
        UIButton* btnLoadMoreItem = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 301, 57)];
        [btnLoadMoreItem setTitle:[NSString stringWithFormat:@"Button %d", rowIndex] forState:UIControlStateNormal];
        [btnLoadMoreItem.titleLabel setFont:[UIFont boldSystemFontOfSize:20]];
        [btnLoadMoreItem setBackgroundImage:[[UIImage imageNamed:@"big-green-button.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
        [btnLoadMoreItem addTarget:self action:@selector(selectLoadMoreItems:) forControlEvents:UIControlEventTouchUpInside];
        [view addSubview:btnLoadMoreItem];
        [btnLoadMoreItem release];
    }
    else {
        UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(10,0,100,57)];
        label.text = [NSString stringWithFormat:@"%d x %d", rowIndex, columnIndex];     
        [view addSubview:label];
        [label release];
    }

    return [view autorelease];
}

- (void) selectLoadMoreItems:(id) sender
{
    rows++;
    [thumbGrid setNeedsDisplay];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    thumbGrid = [[DTGridView alloc] initWithFrame:CGRectMake(0,0, 320, 320)];
    thumbGrid.dataSource = self;
    thumbGrid.gridDelegate = self;
    [self.view addSubview:thumbGrid];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (void)dealloc {
    [super dealloc];
}

@end

我实现了DataSource的所有方法,这似乎有效。网格中填充的行数与我的int“行”(+1)所包含的行数相同。最后一行不包含3列,只有一列。该单元格包含一个按钮(按下时)将“行”整数加1。

问题开始时,它开始重复使用单元格(我猜)并且内容开始消失。当我向后滚动时,我放入细胞的UILabels消失了。

是否有一些错误,代码错误,错误,愚蠢的动作我在这里失踪?希望任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:2)

我已经快速查看了代码,您绝对应该在reloadData中调用setNeedsDisplay而不是selectLoadMoreItems,如下所示:

- (void) selectLoadMoreItems:(id) sender {
    rows++;
    [thumbGrid reloadData];
}

如果有解决方法,请告诉我,如果不是,我今天晚些时候会仔细查看您的代码。

答案 1 :(得分:1)

有一个pull request似乎可以解决这个问题。每次调用checkViews时,底线都是调用initialiseView。