Пользовательские UITableViewCells с программно созданной таблицей - PullRequest
0 голосов
/ 28 января 2011

Когда я пытаюсь загрузить данные из массива в свою таблицу, используя пользовательские ячейки, он показывает только последнюю ячейку, например, перезаписывает все ячейки, пока я не доберусь до конца списка.Таблица была создана программно, и когда ячейки не загружают скроллы пустой таблицы.Однако, если я загружаю ячейки, то отображается только последняя ячейка, и она не прокручивается.

Я полагаю, что я сделал опечатку или еще что-то, но я не вижу ничего, что могло бы оказать большую помощь.Парсер работает и с массивом все в порядке, просто клетки ведут себя странно.Я хотел сделать так, чтобы у меня также была фиксированная полоса над таблицей, но сначала мне нужно было отобразить пользовательские ячейки в таблице и правильно прокрутить

schedule.h

@interface Schedule : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    IBOutlet UITableView *newsTable;

    UIActivityIndicatorView *activityIndicator;

    CGSize cellSize;
    NSXMLParser *fileParser;

    NSMutableArray * events;


    NSMutableArray * announcements;

    NSMutableDictionary * item;

    NSString *currentElement;

    NSMutableString * currentTitle, * currentDate, * currentSummary, * currentId, * curr    entTime, *currentContent; 

    UITableViewCell *appCell;
}

@property(nonatomic, retain)IBOutlet UITableView *newsTable;
@property(nonatomic, retain)IBOutlet UITableViewCell *appCell;

-(void)parseXMLFileAtURL:(NSString *)URL;

@end

schedule.m

- (void)loadView{

    UITableView *tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]
                                                      style:UITableViewStylePlain];
    tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;

    tableView.delegate = self;
    tableView.dataSource = self;
    tableView.tag = 4;
    [tableView reloadData];

    self.view = tableView;
    [tableView release];

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section        {
    return [events count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"MyCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        cell = appCell;
        self.appCell = nil;
    }

    // Configure the cell.
    UILabel *label;
    label = (UILabel *)[cell viewWithTag:1];
    int eventIndex = [indexPath indexAtPosition: [indexPath length] - 1];
    label.text = [[events objectAtIndex: eventIndex] objectForKey: @"event"];

    return cell;
}
- (void)parserDidEndDocument:(NSXMLParser *)parser {

    NSLog(@"webpage parsed");
    NSLog(@"events array has %d items", [events count]);
    newsTable = (UITableView*)[self.view viewWithTag:4];
    [newsTable reloadData];
}

Я добавил больше кода, проблема может быть в другом месте.

Ответы [ 2 ]

0 голосов
/ 28 января 2011

попробуйте следующий код:


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier  = @"CellIdentifier";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // CustomCell is the class for standardCell
    if (cell == nil) 
    {
        NSArray *objectList = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        for (id currentObject in objectList) {
            if([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (CustomCell*)currentObject;
                break;
            }
        }
        cell.label.text = [[events objectAtIndex: indexPath.row] objectForKey: @"event"];
    }
    return cell;
}

, когда вы загрузите файл XIB с NSBundle, он вернет массив Bundle.Затем вы должны проверить его и затем использовать.

Если вы пробовали как;

<code>NSString *memberName; // member variable

NSString *name = memberName;
memberName = nil;</code>
// the member variable "memberName, giving the reference to name; 
//So if you set memberName as nil, name also become a nil value.

// You have to use like;
name = [memberName retain];
memberName = nil;

Попробуйте узнать больше о документах по разработке для iPhone.

Нажмитездесь для документации.
Нажмите здесь для примера кода.

Я думаю, что это поможет вам.

0 голосов
/ 28 января 2011

Я думаю, ваша проблема в том, что клетка освобождается. Когда вы вызываете self.appCell = nil;, объект будет освобожден, а переменная установлена ​​в ноль. Попробуйте изменить cell = appCell; на cell = [[appCell retain] autorelease];, чтобы ячейка сохранялась достаточно долго, чтобы табличное представление сохраняло ее снова.

Также вы можете изменить int eventIndex = [indexPath indexAtPosition: [indexPath length] - 1]; на int eventIndex = indexPath.row;. Свойства строки и раздела были добавлены в NSIndexPath специально для использования в UITableView, и гарантируется, что путь индекса, передаваемый в cellForRowAtIndexPath: будет содержать ровно два индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...