1

データをリロードする前にテーブル ビューのすべての行を削除したいのですが、うまくいきません。

ビューコントローラーで、この AFNetworking リクエストから配列を取得します。

- (void)viewDidLoad
    [[LocationApiClient sharedInstance] getPath:@"locations.json" 
                                     parameters:nil 
                                        success:
                ^(AFHTTPRequestOperation *operation, id response) {
                    NSLog(@"Response: %@", response);
                    NSMutableArray *location_results = [NSMutableArray array];
                    for (id locationDictionary in response) {
                       Location *location = [[Location alloc] initWithDictionary:locationDictionary];
                       [location_results addObject:location];  
                    }
                    self.location_results = location_results;
                    [self.tableView reloadData];
                    }
                                    failure:
                ^(AFHTTPRequestOperation *operation, NSError *error) {
                    NSLog(@"Error fetching locations!");
                    NSLog(@"%@", error);
                }];  
}

そして、データを削除してから、このボタンで再ロードしたい

- (IBAction)locationPressed:(id)sender {

    [[Location sharedSingleton].locationManager startUpdatingLocation];
    [self viewDidLoad];
    NSMutableArray *location_results = [NSMutableArray array];
    [location_results removeAllObjects];
    [self.tableView reloadData];

}

しかし、それは行を削除していません。既に存在する行の上でリロードが発生していることがわかります。助言がありますか?

4

1 に答える 1

2

手動で電話をかけないでください。viewDidLoad

のようなメソッドを作成します。

- (void)reloadDataWithCompletion:(void(^)(NSArray *locations))completion
                         failure:(void(^)(NSError *error))failure {
    [[LocationApiClient sharedInstance] getPath:@"locations.json" 
                                     parameters:nil 
                                        success:
            ^(AFHTTPRequestOperation *operation, id response) {
                NSLog(@"Response: %@", response);
                NSMutableArray *location_results = [NSMutableArray array];
                for (id locationDictionary in response) {
                   Location *location = [[Location alloc] initWithDictionary:locationDictionary];
                   [location_results addObject:location];  
                }
                    if(completion)
                        completion(location_results);
                }
                                failure:
            ^(AFHTTPRequestOperation *operation, NSError *error) {
                if(failure)
                    failure(error);
            }];  
}

データをリロードする必要があるときはいつでも呼び出します

- (void)viewDidLoad {
    [super viewDidLoad]; // Don't forget the call to super!

    [self reloadDataWithCompletion:^(NSArray *locations) {
        self.location_results = locations;
        [self.tableView reloadData];
    } failure:^(NSError *error) {
        NSLog(@"Error fetching locations!");
        NSLog(@"%@", error);
    }];
}

- (IBAction)locationPressed:(id)sender {
    [[Location sharedSingleton].locationManager startUpdatingLocation];
    [self reloadDataWithCompletion:^(NSArray *locations) {
        self.location_results = locations;
        [self.tableView reloadData];
    } failure:^(NSError *error) {
        NSLog(@"Error fetching locations!");
        NSLog(@"%@", error);
    }];
}

テーブルをリロードするためのグラフィカルな効果を実現するには (セクションが 1 つしかないと仮定して)、次のように置き換えます。

[self.tableView reloadData];

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
于 2013-04-10T03:14:39.543 に答える