使用数据库中的数据自定义UITableViewCell

时间:2012-01-20 11:08:48

标签: objective-c ios uitableview

我正在制作一个自定义的UITableViewCell。因此,我们的想法是创建一个带有某种新闻的UITableView。这个新闻有一个主题和描述。我有一个NieuwsTableviewCell类和一个UITableViewController的FirstViewController。我正在使用PHP文件从数据库中获取数据。 如何获取标签上每个新行的news_topic和说明?

我的FirstViewController.m文件看起来像这样。

#import "FirstViewController.h"
#import "NieuwsTableViewCell.h"

@implementation FirstViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}
-(void) getData:(NSData *) data{

    NSError *error;

    json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

    [self.tableView reloadData];
}
-(void) start {

    NSURL *url = [NSURL URLWithString:kGETUrl];

    NSData *data = [NSData dataWithContentsOfURL:url];

    [self getData:data];

}
- (void)viewDidLoad
{
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [super viewDidLoad];
[self start];

}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return [json count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    NieuwsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"NieuwsTableViewCell" owner:nil options:nil];

        for (UIView *view in views) {
            if([view isKindOfClass:[UITableViewCell class]])
            {
                NSDictionary *info = [json objectAtIndex:indexPath.row];
                cell.textLabel.text = [info objectForKey:@"Nie_topic"];
                cell = (NieuwsTableViewCell*)view;
            }
        }
    }

    return cell;
}

FirstViewController。 h文件

#define kGETUrl @"http://localhost/getNieuws.php"
@interface FirstViewController : UITableViewController{
     NSMutableArray *json;
}

这是我的NieuwsTableViewCell.h文件

@interface NieuwsTableViewCell : UITableViewCell{
   IBOutlet UILabel *topic;
   IBOutlet UILabel *omschrijving;

}
@property (nonatomic, retain) IBOutlet UILabel *topic;
@property (nonatomic, retain) IBOutlet UILabel *omschrijving;

@end

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

你在这个方法中得到任何数据吗??

-(void) getData:(NSData *) data

检查阵列&在其中打印每个字典..

答案 1 :(得分:0)

问题出在这里:

NSDictionary *info = [json objectAtIndex:indexPath.row];
cell.textLabel.text = [info objectForKey:@"Nie_topic"];
cell = (NieuwsTableViewCell*)view;

在上面的代码中,您将设置已出列或为空的UITableViewCell的属性,然后重新设置单元格变量,覆盖您对textLabel所做的更改,从而导致无法显示主题。

请考虑以下代码。与您目前使用的代码相比,如果tableView尚未创建可重用单元格,则调用if语句,并将单元格设置为您正在加载的nib中的UITableViewCell子视图。我们不是在单元格为零时设置textLabel的文本,而是对每个单元格执行此操作,以防止重用问题,并且单元格中不显示任何主题。

NieuwsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    NSArray *subViews = [[NSBundle mainBundle] loadNibNamed:@"NieuwsTableViewCell" owner:nil options:nil];

    for (UIView *view in subViews) {
        if([view isKindOfClass:[UITableViewCell class]])
        {
            cell = (NieuwsTableViewCell*)view;
        }
    }
}
NSDictionary *info = [json objectAtIndex:indexPath.row];
cell.textLabel.text = [info objectForKey:@"Nie_topic"];

编辑---刚刚意识到这篇文章已经有1年了,今天是最后更新的,这也是我发布答案的原因。如果这对任何人都有利,那么它是值得的。