通过代码错误刷新tableView与refreshcontrol

时间:2013-09-06 18:28:49

标签: ios objective-c uitableview block uirefreshcontrol

我正在尝试使用refreshControl按代码执行所有操作当我拉取tableView并且我调用服务器时出现问题。它告诉我这个错误:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 6 beyond bounds for empty array'

当我运行这个简单的应用程序时,我会在表格视图中查看数据。我不知道为什么会有这个问题。

以下是代码:

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray * data;
@property (nonatomic, strong) UIRefreshControl *spinner ;
@end

@implementation YPProjectListViewController

@synthesize tableView;
@synthesize data;
@synthesize spinner;

- (void)viewDidLoad {
    [super viewDidLoad];
    spinner = [[UIRefreshControl alloc]initWithFrame:CGRectMake(130, 10, 40, 40)];
    [self loadProjectsFromService];
    [spinner addTarget:self action:@selector(loadProjectsFromService) forControlEvents:UIControlEventValueChanged];
    [tableView addSubview:spinner];


    }



-(void)loadProjectsFromService{
     [spinner beginRefreshing];
    self.data = [[NSMutableArray alloc] init];
    [self.view addSubview:self.tableView];
    __weak typeof(self) weakSelf = self;
    successBlock = ^(NSMutableArray *newData) {
        if ([newData count] > 0) {
            [weakSelf refreshData:newData];
        }

    };
        [spinner endRefreshing];
    [ypNetManager getProjectListWithSuccessBlock:successBlock error:NULL];

}


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

#pragma mark - Custom getter

- (UITableView *)tableView {
    //custom init of the tableview
    if (!tableView) {
        // regular table view
        tableView = [[UITableView alloc] initWithFrame:UIEdgeInsetsInsetRect(self.view.bounds, tableViewInsets) style:UITableViewStylePlain];
        tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        tableView.delegate = self;
        tableView.dataSource = self;
        tableView.backgroundColor = [UIColor clearColor];
        return tableView;
    }
    return tableView;
}

#pragma mark - Private methods 

- (void)refreshData:(NSMutableArray *)newData {
    NSLog(@"data %@", newData);
    self.data = newData;
    [self.tableView reloadData];
}

1 个答案:

答案 0 :(得分:1)

我认为从服务器获取数据没有任何问题。您可能错误地做的唯一事情是在重新初始化self.data时不刷新tableView。

当你下拉并释放表视图时,需要显示第6个tableView单元格,该单元格从视口出来,你的单元格需要数据中的第6个对象,但你的数据不再存在。

只需插入以下内容即可。

-(void)loadProjectsFromService{
    [spinner beginRefreshing];
    self.data = [[NSMutableArray alloc] init];

    [self.tableView reloadData]; //Insert table reload here.

    //... rest of your code ...
}