ios reloadData只重新加载不可见的单元格



我在这里阅读了很多关于我的问题的帖子,但没有一个有效,所以提前感谢你的帮助。

我有一个tableview,它装载一个自定义nib。我有数据来自web JSON文件。我已经实现了一个刷新调用(我现在用一个cell tap覆盖它)。

在调用该方法时,将调用并解析新的JSON。细胞更新了。我可以通过向下滚动tableview来确认这一点,我可以看到新的行。但是仍然保留可见的行。

我试图使数组为nil,循环并删除基于对象,但似乎没有工作。

这里是代码

#import "MMNewsViewController.h"
#import "MMCatsDetailController.h"
#import "CellView.h"
#import "FeatureCell.h"
//#import "MMnewsData.h"

@interface MMNewsViewController ()
@end
@implementation MMNewsViewController
@synthesize titleData;
@synthesize imageData;
@synthesize imageLargeData;
@synthesize dateData;
@synthesize descriptionData;
@synthesize linkData;
@synthesize cityData;
@synthesize _jsonResult;
@synthesize _jsonResultImage;
@synthesize _jsonResultImageLarge;
@synthesize _jsonResultDate;
@synthesize _jsonResultDescription;
@synthesize _jsonResultLink;
@synthesize _jsonResultCity;
@synthesize featureImage;
@synthesize region;


- (void)viewDidLoad
{
    [super viewDidLoad];
    UINib *nib = [UINib nibWithNibName:@"CellView" bundle:nil];
    [self.tableView registerNib:nib forCellReuseIdentifier:@"CellView"];
    [self.navigationController.navigationBar setTintColor:[UIColor blackColor]];
    self.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:0];
    self.navigationController.title = @"News";
    self.tabBarItem.title = @"FooBar";
    self.title = @"Music News";

 UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
[refreshControl addTarget:self action:@selector(refreshView:)        
forControlEvents:UIControlEventValueChanged];
[self.view addSubview:refreshControl];
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
    region = @"wellington";
    [self makeDataRequests];

}
-(void)makeDataRequests
{

    NSString *strURL = [NSString stringWithFormat:@"MYSITEjson.php?region=%@",region  ];

    NSMutableData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL] ];
    NSMutableDictionary *arrayResult = [NSJSONSerialization JSONObjectWithData:dataURL options:kNilOptions    error:nil];
    NSMutableArray *dataArray = [arrayResult objectForKey:@"tickets"]; //2
    _jsonResult = [[NSMutableArray alloc] init];
    _jsonResultImage = [[NSMutableArray alloc] init];
    _jsonResultImageLarge = [[NSMutableArray alloc] init];
    _jsonResultDate= [[NSMutableArray alloc] init];
    _jsonResultDescription= [[NSMutableArray alloc] init];
    _jsonResultLink= [[NSMutableArray alloc] init];
    _jsonResultCity= [[NSMutableArray alloc] init];

    for(NSMutableDictionary *newsDict in dataArray){
        NSMutableDictionary *titleDict = [newsDict objectForKey:@"title"];
        NSMutableDictionary *imageDict = [newsDict objectForKey:@"image"];
        NSMutableDictionary *imageLargeDict = [newsDict objectForKey:@"imageLarge"];
        NSMutableDictionary *dateDict = [newsDict objectForKey:@"pubDate"];
        NSMutableDictionary *descriptionDict = [newsDict objectForKey:@"description"];
        NSMutableDictionary *linkDict = [newsDict objectForKey:@"link"];
       NSMutableDictionary *cityDict = [[newsDict objectForKey:@"venue"] objectForKey:@"city"];

        [_jsonResult addObject:titleDict];
        [_jsonResultImage addObject:imageDict];
        [_jsonResultImageLarge addObject:imageLargeDict];
        [_jsonResultDate addObject:dateDict];
        [_jsonResultDescription addObject:descriptionDict];
        [_jsonResultLink addObject:linkDict];
         [_jsonResultCity addObject:cityDict];
       //  NSLog(@"%@",cityDict);
    }
    //   NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];

    self.titleData = _jsonResult;
    self.imageData = _jsonResultImage;
    self.imageLargeData = _jsonResultImageLarge;
    self.dateData = _jsonResultDate;
    self.descriptionData = _jsonResultDescription;
    self.linkData = _jsonResultLink;
    self.cityData = _jsonResultCity;

[self performSelector:@selector(delayedReloadData) withObject:nil afterDelay:1.5];
}
-(void) delayedReloadData
{
     NSLog(@"delayedReloadData");
   [self.tableView reloadData];
}
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation{
       NSLog(@"reloadRowsAtIndexPaths");
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    NSLog(@"COUNTER: %i",[self.titleData count]);
    // Return the number of rows in the section.
   return [self.titleData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
      NSLog(@"cellForRowAtIndexPath");
   NSUInteger row  = [indexPath row];

        static NSString *CellIdentifier = @"CellView";
        CellView *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil){
            NSLog(@"New Cell Made");
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CellView" owner:nil options:nil];
            for(id currentObject in topLevelObjects)
            {
                if([currentObject isKindOfClass:[CellView class]])
                {
                    cell = (CellView *)currentObject;
                    break;
                }
            }
        }

         [[cell titleLabel] setText:[titleData objectAtIndex:row]];
         [[cell dateLabel] setText:[cityData objectAtIndex:row]];
        NSData *data = [NSData dataWithContentsOfURL: [NSURL URLWithString:[imageData objectAtIndex:row]]];
        UIImage *img1 = [UIImage imageWithData:data];
        [[cell imageLabel] setImage:img1];
        return cell;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

}

#pragma mark - Table view delegate
- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated{}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
     MMCatsDetailController *detailViewController = [[MMCatsDetailController alloc] initWithNibName:@"MMCatsDetailController" bundle:nil];

    NSUInteger row  = [indexPath row];
    NSString *titleSender = [titleData objectAtIndex:row];
    NSString *dateSender = [dateData objectAtIndex:row];
    NSString *imageSender = [imageData objectAtIndex:row];
    NSString *imageLargeSender = [imageLargeData objectAtIndex:row];
    NSString *descriptionSender = [descriptionData objectAtIndex:row];
    NSString *linkSender = [linkData objectAtIndex:row];
    detailViewController.titleSend = titleSender;
    detailViewController.dateSend = dateSender;
    detailViewController.imageSend = imageSender;
    detailViewController.imageLargeSend = imageLargeSender;
    detailViewController.descriptionSend = descriptionSender;
    detailViewController.linkSend = linkSender;
      //NSLog(@"linkSender=%@",linkSender);
        region = @"nelson";
[self makeDataRequests];
    //   [self.navigationController pushViewController:detailViewController animated:YES];
  [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
-(void)refreshView:(UIRefreshControl *)refresh {
       refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."];
       // custom refresh logic would be placed here...
         region = @"nelson";
    [self makeDataRequests];

    NSLog(@"HEre");
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MMM d, h:mm a"];
      NSString *lastUpdated = [NSString stringWithFormat:@"Last updated on %@",
                                        [formatter stringFromDate:[NSDate date]]];
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated];
      [refresh endRefreshing];
     NSLog(@"HEre");
 }
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
     NSLog(@"numberOfSectionsInTableView");
    return 1;
}
 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row  = [indexPath row];
    if(row==0){
   //     return 200;
    }
    else{

//    return 96;
          }
      return 96;
}

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,10)];
    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, headerView.frame.size.width, headerView.frame.size.height)];
    headerLabel.font = [UIFont boldSystemFontOfSize:12];
    headerLabel.text = @"Music News";
    headerLabel.backgroundColor = [UIColor blackColor];
     headerLabel.textColor = [UIColor whiteColor];
    [headerView addSubview:headerLabel];
    return headerView;
}

@end

你需要做的就是在tableView上调用reloaddata。要么你没有在tableView上调用reloaddata你认为正在调用它,你的单元格没有在tableView:cellForRowAtIndexPath:中正确设置,或者你正在调用reloaddata而不是在主线程上。

你不应该从你的UI线程对服务器进行同步调用。阅读一下GCD。dispatch_async函数在对服务进行非阻塞调用时会派上用场。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"CueTableCell";
CueTableCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
    NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"CueTableCell XibName" owner:self options:nil];
    // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
    cell = [array objectAtIndex:0];
}
return cell;
}

最新更新