セルが 1 つしかないテーブル ビューがあります。メソッドを呼び出すときに、メソッドを更新しようとすると、テキスト ラベルのテキストが変更されます。ただし、そうではなく、ビューが表示された場合にのみ変更されます。
私は多くの場所で追加NSLog()
し、正しいメソッドと条件が呼び出されました
私はいくつかのことを試しました:
reloadData
setNeedsDisplay
setNeedsLayout
reloadCell
reloadRowsAtIndexPaths: withRowAnimation:
しかし、何もUITableViewDataSource
機能していません。適切に呼び出されているため、コードに問題がないことはわかっています。
これは私があなたに与えることができる最も適切なコードです:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
tableView.scrollEnabled = NO;
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: @"cell"];
if (cell) {
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if ([[TravelLogViewController locationArray] count]) {
NSDictionary *flight = [NSDictionary dictionaryWithObjectsAndKeys:[[TravelLogViewController locationArray] lastObject], @"name", [[TravelLogViewController dateArray] lastObject], @"date", [[TravelLogViewController milesGainedIndex] lastObject], @"miles", nil];
cell.detailTextLabel.textColor = [UIColor blackColor];
cell.textLabel.numberOfLines = 2;
cell.detailTextLabel.numberOfLines = 2;
cell.textLabel.font = [UIFont fontWithName:@"Avenir" size: 14.0];
cell.detailTextLabel.font = [UIFont fontWithName:@"Avenir" size: 12.0];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = [flight objectForKey: @"name"];
cell.detailTextLabel.text = [NSString stringWithFormat:@"Flight Date: %@, Miles Gained: %.1f", [flight objectForKey: @"date"], [[flight objectForKey: @"miles"] doubleValue]];
cell.backgroundColor = [UIColor colorWithWhite:0.92 alpha:1];
// cell.backgroundColor = [UIColor clearColor];
}
else {
// This gets called when I want it to, but the textLabel text or detailTextLabel text is not changed
cell.detailTextLabel.text = nil;
cell.textLabel.text = nil;
cell.textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size: 18.0];
cell.textLabel.text = @"\n\n No Flights";
}
}
return cell;
}
アップデート:
ARC を使用していますが、セルを更新しようとしたときにテーブル ビューが nil であることがわかりましたが、セルを修正しましたが、その理由がわかりません!?
テーブルビューをどこにも解放したり解放したりしていません。まだ割り当てられているはずです
ちなみに私はタブバーコントローラーを持っています
アップデート:
賞金を開始しました.1週間以上経ちましたnil
.
アップデート:
わかりました、ユーザーがスワイプしてセルを削除できることを忘れていました。彼がそうすると、実際にセルを削除するのではなく、テキストを変更するだけです (つまり、更新されていない部分です)。ログを入力すると、ユーザーがスワイプして削除するviewDidLoad
とviewDidAppear
、テーブルビューが有効であるように見えます...これが私のコードです:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
TravelLogViewController *travel = [[TravelLogViewController alloc] init];
[travel manuallyDeleteTopCellData]; // Deletes some data in other view controller and calls the method `proceedWithDeletion`
}
}
- (void)proceedWithDeletion {
// Method is called from another view controller
NSLog(@"%@", mostRecentFlight.description); // NIL HERE
[mostRecentFlight reloadData];
[mostRecentFlight setNeedsDisplay];
[mostRecentFlight setNeedsLayout];
}
TravelLogViewController
- (void)manuallyDeleteTopCell {
[TheMileIndexViewController deductDesiredMilesToIndex: [[milesGainedIndex lastObject] floatValue]];
[locationArray removeLastObject];
[milesGainedIndex removeLastObject];
[dateArray removeLastObject];
MenuMileIndexViewController *menu = [[MenuMileIndexViewController alloc] init];
[menu proceedWithDeletion];
}
要約すると、ビューがロード/表示されると、テーブルビューは有効になります。ユーザーがスワイプして削除すると、実際には行が削除されず、TravelLogViewController
メソッドと呼ばれる別のビューコントローラーが呼び出されmanuallyDeleteTopCellData
、データが削除され、そのメソッドが元のビューコントローラーで別のメソッドが呼び出されproceedWithDeletion
、テーブルビューをリロードするはずの場所で呼び出されます、しかしそうではありません(問題)。この理由はproceedWithDeletion
、テーブル ビューでは nil だからですが、なぜ!?