2010-04-28 3 views
4

Я использую DTGridView от DTKit от Daniel Tull. Я реализовал его в очень простом ViewController, и тест, который я делаю, - это поместить кнопку в последнюю строку сетки, которая должна добавить еще одну строку в сетку (и для этого перемещение кнопки в строку под ней).DTGridView потерять контент при прокрутке

Проблема в том, что, когда я нажимаю кнопку несколько раз, а затем начинаю прокрутку, сетка, кажется, теряет содержимое. Поскольку я не полностью уверен, что это ошибка в сетке, но больше в моем коде, я надеюсь, вы, ребята, можете помочь мне и отследить ошибку.

Во-первых у меня есть заголовочный файл, который довольно просто, потому что это тест:.

#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, который, кажется, работает. Сетка заполнена таким количеством строк, что и мои «строки» (+1). Последняя строка НЕ ​​содержит 3 столбца, но только одну. Эта ячейка содержит кнопку, которая (при нажатии) добавляет 1 к целому числу «rows».

Проблема начинается, когда начинается повторное использование ячеек (я угадываю) и начало содержимого исчезает. Когда я прокручиваю резервные копии, UILabels, которые я помещаю в ячейки, исчез.

Есть ошибки, код ошибки, ошибки, тупик-переезд Мне здесь не хватает? Надеюсь, кто-нибудь может помочь.

ответ

2

Я был беглый взгляд на код, и вы должны определенно называть reloadData вместо setNeedsDisplay в selectLoadMoreItems так:

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

Позвольте мне знать, если это фиксирует это, если я не возьму надлежащим образом просмотрите свой код позже сегодня.

+0

Привет, Даниил, спасибо, что ответили. Я попытался сделать это (это была моя первая попытка), но это вызывает мерцание в сетке и не решает проблему. –

+0

У меня такая же проблема, и reloadData не работает :(( –

1

Существует pull request, который, кажется, решает эту проблему. В нижней строке вызывается initialiseViews каждый раз, когда вызывается checkViews.

Смежные вопросы