多くのビューとテーブルビューを備えたビューコントローラがあります。
テーブルビューのセルはカスタマイズされているため、セルを設定するための別のクラスがあります。各セルにはボタンがあります。このボタンの画像は、セルのコンテンツに応じて変化します(このコンテンツはDBから読み取られます)。
基本的に、ユーザーがボタンを押すと、ボタンは別の画像に変わり、新しいステータスがDBに書き込まれますが、テーブルビューは自動的に更新されません。
ボタンのメソッドはカスタムセルクラスにあるため、ビューコントローラー(テーブルビューを持つもの)をインスタンス化し、ビューとテーブルビューのいくつかのラベルを更新するためのメソッドを実行しようとしました。
ViewControllerWithTable *vc = [[ViewControllerWithTable alloc] init];
[vc updateEverything];
しかし、これは機能しません。同じ「ViewControllerWithTable」(リロードボタンの追加)から呼び出された同じ「updateEverything」メソッドは完全に機能します。すべてのアクションが同じビューで実行されるため、viewWillAppearメソッドに「[tableViewreloadData]」を追加しても機能しません。
私は何が欠けていますか?
編集:より明確にするためにいくつかのコードを追加します。
これは、テーブルビューを更新するために使用する方法です。これは、テーブルビューが埋め込まれたViewController内にあり、ビューの1つにあるボタンによってトリガーされたときに機能します。
- (void) updateEverything {
// lots of DB writing and reading, plus label text changing inside all the views
[tableView reloadData];
}
これはボタンを押すためのIBActionであり、カスタムセルクラスにあります。
-(void) btnPresaPressed:(UIButton *)sender {
AppDelegate *deleg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
deleg.did = sender.tag;
NSString *s1 = NSLocalizedString(@"ALERT_TITLE", nil);
NSString *s2 = NSLocalizedString(@"ALERT_BODY", nil);
NSString *s3 = NSLocalizedString(@"YES", nil);
NSString *s4 = NSLocalizedString(@"NO", nil);
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:s1
message:s2
delegate:self
cancelButtonTitle:s4
otherButtonTitles:s3, nil];
[alertView setTag:1];
[alertView show];
}
このメソッドは、常にカスタムセルクラスで別のメソッドを呼び出すアラートビューを表示します。
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
AppDelegate *deleg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
DbOperations *db = [[DbOperations alloc] init];
NSString *alrtTitle = [alertView buttonTitleAtIndex:buttonIndex];
NSString *s3 = NSLocalizedString(@"YES", nil);
NSString *s4 = NSLocalizedString(@"NO", nil);
switch (alertView.tag) {
case 1:
//
break;
case 2:
if ([alrtTitle isEqualToString:s3]) {
// DB writing and reading
ViewControllerWithTable *vc = [[ViewControllerWithTable alloc] init];
[vc updateEverything];
} else if ([alrtTitle isEqualToString:s4]){
//
}
break;
case 3:
if ([alrtTitle isEqualToString:s3]) {
//
}
break;
default:
break;
}
}
この場合、updateEverythingメソッドは機能しません。