現在、MBProgressHUD と NSURLConnection を使用してテーブルビューに取り組んでいます。問題は、たとえばユーザーが 80 行目にいて、テーブルがより少ないデータで更新されたときに 10 行しか存在しないような場合、このアプリは完全にクラッシュします。ユーザーが見ている行が解放された 80 行目につながるためです。不良メモリ アクセス エラー。
ユーザーがどこにいても、アプリがクラッシュしないようにしたいと思います。この問題を修正する最善の方法は何ですか? :S
現在、MBProgressHUD と NSURLConnection を使用してテーブルビューに取り組んでいます。問題は、たとえばユーザーが 80 行目にいて、テーブルがより少ないデータで更新されたときに 10 行しか存在しないような場合、このアプリは完全にクラッシュします。ユーザーが見ている行が解放された 80 行目につながるためです。不良メモリ アクセス エラー。
ユーザーがどこにいても、アプリがクラッシュしないようにしたいと思います。この問題を修正する最善の方法は何ですか? :S
@Bergasmsは正しいです。あなたの問題はスクロールされているテーブルとは関係ありません。この状況でテーブルを無効にすることはおそらく賢明ではありません(設計の観点から)。そうは言っても、scrollEnabled
プロパティを使用して設定することができますNO
[self.tableView reloadData]
ただし、クラッシュを解決するには、データソースが更新されたらすぐに呼び出す必要があります。
また、tableView:numberOfRowsInSection:
データソースをサポートするオブジェクトからカウントを返す必要があります。
以下は、スクロール中にデータソースを更新しても、正しく行われた場合にクラッシュが発生しないことを示す実装例です。
@interface CLViewController ()
@property (nonatomic, strong) NSMutableArray *stuffs;
@end
@implementation CLViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.stuffs = [NSMutableArray array];
for (int i = 0; i <= 100; i++) {
[self.stuffs addObject:[NSString stringWithFormat:@"%d", i]];
}
int64_t delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self.stuffs removeAllObjects];
for (int i = 0; i <= 10; i++) {
[self.stuffs addObject:[NSString stringWithFormat:@"%d", i]];
[self.theTableView reloadData];
}
});
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.stuffs.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"StuffCell"];
cell.textLabel.text = [self.stuffs objectAtIndex:indexPath.row];
return cell;
}
@end
これにより、アプリの起動時にすぐにスクロールできるstuffs
配列に100 行が読み込まれます。viewDidLoad
3 秒後、stuffs
配列は空になり、10 個の項目が読み込まれ、次[self.theTableView reloadData];
が呼び出されます。相互作用は少し揺れますが、基本的に最後の 90 行が消え、すべてが正常に終了し、クラッシュしません。