我正在使用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消失了。
是否有一些错误,代码错误,错误,愚蠢的动作我在这里失踪?希望任何人都可以提供帮助。
答案 0 :(得分:2)
我已经快速查看了代码,您绝对应该在reloadData
中调用setNeedsDisplay
而不是selectLoadMoreItems
,如下所示:
- (void) selectLoadMoreItems:(id) sender {
rows++;
[thumbGrid reloadData];
}
如果有解决方法,请告诉我,如果不是,我今天晚些时候会仔细查看您的代码。
答案 1 :(得分:1)
有一个pull request似乎可以解决这个问题。每次调用checkViews时,底线都是调用initialiseView。