UITableview在reloadData之后保留旧单元格

时间:2013-08-08 00:21:02

标签: uitableview scroll reloaddata

我的视图底部有一个tabBar和一个tableview。按下barButtonItem时,保存tableview数据的数组会发生更改。

使用NSLogs,很明显阵列确实在变化,因为[NSArray count]显示不同的值。但是,当我使用[UITableview reloadData]时,单元格保持不变。

如果我向上滚动一点,然后向下滚动,屏幕外的任何内容都会更新。我猜这是因为当它离开屏幕时它会出列,当它返回时会重新绘制新数据。有没有办法让它重绘一切?

#import "TableViewController.h"

@interface TableViewController ()

@end

@implementation TableViewController
@synthesize listBar,selectedTab , linkTableView, barButton5, barButton4, barButton3, barButton2, barButton1, Lists, imageID, titleID, linkID, cells;


- (void)viewDidLoad
{
    [super viewDidLoad];
    linkTableView = [[UITableView    alloc] init];
    Lists         = [[NSArray        alloc] init];
    imageID       = [[NSMutableArray alloc] init];
    titleID       = [[NSMutableArray alloc] init];
    linkID        = [[NSMutableArray alloc] init];
    linkTableView.delegate   = self;
    linkTableView.dataSource = self;
}

-(void)viewWillAppear:(BOOL)animated{
    NSArray *barItems = [[NSArray alloc] initWithObjects:barButton1, barButton2, barButton3, barButton4, barButton5, nil];
    listBar.selectedItem = [barItems objectAtIndex:selectedTab];

    //when view will appear load data dependent on selectedTab
    [self performSelector:@selector(updateTable)];
}

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

-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{
    selectedTab = item.tag;
    [self performSelector:@selector(updateTable)];
}

-(void)updateTable{
    [imageID removeAllObjects];
    [titleID removeAllObjects];
    [linkID removeAllObjects];


    //load from the xml file
    RXMLElement *rxml = [RXMLElement elementFromXMLFile:@"Lists.xml"];
    //makes an array from the list children
    Lists = [rxml children:@"List"];
    cells = [[Lists objectAtIndex:selectedTab] children:@"Cell"];
    [rxml iterateElements:cells usingBlock:^(RXMLElement *cellElement) {
        [imageID addObject:[cellElement child:@"ImageName"]];
        [titleID addObject:[cellElement child:@"CellText" ]];
        [linkID  addObject:[cellElement child:@"Link"     ]];
    }];

    NSLog(@"Count is %i", [cells count]);
    [linkTableView reloadData];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

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

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 60;
}

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

    static NSString *CellIdentifier = @"LinkCell";
    linkCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if (cell == nil) {
        cell = [[linkCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    NSString *imageName = [NSString stringWithFormat:@"%@", [imageID objectAtIndex:indexPath.row]];
    cell.image.image = [UIImage imageNamed:imageName];
    NSString *labelText = [NSString stringWithFormat:@"%@", [titleID objectAtIndex:indexPath.row]];
    cell.linkCellLabel.text = labelText;
    return cell;
}

/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/

/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
*/

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     */
}

@end

1 个答案:

答案 0 :(得分:0)

从代码中删除此行:
linkTableView = [[UITableView alloc] init];

或您的uitableview的任何其他初始值设定项 并使用此代码更新章节

  [self.tableView beginUpdates];
NSMutableIndexSet* index = [[NSMutableIndexSet alloc]init];
[index addIndex:0];
[self.tableView reloadSections:index withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];