为什么我的UITableView在5行后重复行?

时间:2014-10-28 19:44:03

标签: ios objective-c uitableview

我的数据库中有7行。我确认所有的数据都是由NSLog成功传递到iOS端的postArray,它给出了7.然而,当我运行我的应用程序时,它只显示前5行,然后是前2行而不是6行,我的数据库中的第7行。另外,当我从我的第6和第7个文本视图中查看实际文本时,正确的文本就在那里...为什么在5行之后重复?谢谢。这是我的代码:

#import "DailyViewController.h"
#import "Post.h"

@interface DailyViewController ()

@end

@implementation DailyViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // View background
    [self.view setBackgroundColor:[UIColor colorWithRed:(255/255.0) green:(221/255.0) blue:(85/255.0) alpha:1.0f]];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://example.org/getPosts.php"]];
    NSData *data = [NSData dataWithContentsOfURL:url];

    jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
    postArray = [[NSMutableArray alloc] init];

    for(int i = 0; i < jsonArray.count; i++)
    {
        NSString *nickname = [[jsonArray objectAtIndex:i] objectForKey:@"nickname"];
        NSString *squeal = [[jsonArray objectAtIndex:i] objectForKey:@"squeal"];

        [postArray addObject:[[Post alloc] initWithNickname:nickname andSqueal:squeal]];
    }

    viewArray = [[NSMutableArray alloc] init];
    for(int i = 0; i < postArray.count; i++)
    {
        Post *postObject;
        postObject = [postArray objectAtIndex:i];

        UILabel *nicknameLabel = [[UILabel alloc]initWithFrame:CGRectMake(30, 15, 320, 30)];
        nicknameLabel.text = postObject.nickname;
        nicknameLabel.font = [UIFont boldSystemFontOfSize:20];

        UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(25, 42, 320, 0)];
        textView.font = [UIFont systemFontOfSize:15];
        textView.text = postObject.squeal;
        textView.editable = false;
        [textView setScrollEnabled:false];
        [textView sizeToFit];
        [textView layoutIfNeeded];

         UIView *view = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 320, 30+textView.frame.size.height)];

        [view addSubview:nicknameLabel];
        [view addSubview:textView];

        [viewArray addObject:view];
    }

    [self.tableView reloadData];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return postArray.count;
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        [cell.contentView addSubview:[viewArray objectAtIndex:indexPath.row]];
    }

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 0;
}

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIView *view = [viewArray objectAtIndex:indexPath.row];
    return view.frame.size.height+30;
}

@end

3 个答案:

答案 0 :(得分:1)

UITableView重复使用具有相同重用标识符的单元格,这意味着当您滚动以使行滚动出可见区域时,它将用于显示新行。这就是为什么当你的第1和第2行滚出视图时,它们被用来显示第5行和第6行。

您需要修改加载单元格的方式。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        // Add and setup views here.
    }
    //Add content to view here
    // e.g. cell.textLabel.text = @"Some text";

    return cell;
}

BTW 您可以使用textLabel的属性UITableViewCell,而不是创建新标签并将其添加为子视图。如果您需要更多地控制自定义单元格,则应创建自定义类并使用Storyboard文件或Xib文件。

答案 1 :(得分:0)

if(cell == nil)
{
  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
else
{
  [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
}
[cell.contentView addSubview:[viewArray objectAtIndex:indexPath.row]];

答案 2 :(得分:0)

cellForRowAtIndexPath方法中,只有在第一次初始化单元格时,才会向单元格的内容视图添加子视图。

相反,您应该在每次调用时添加/替换子视图cellForRowAtIndexPath