0

多くのビューとテーブルビューを備えたビューコントローラがあります。

テーブルビューのセルはカスタマイズされているため、セルを設定するための別のクラスがあります。各セルにはボタンがあります。このボタンの画像は、セルのコンテンツに応じて変化します(このコンテンツは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メソッドは機能しません。

4

3 に答える 3

3

コードを追加した後に編集します。

次の行で:

        if ([alrtTitle isEqualToString:s3]) {
            // DB writing and reading
            ViewControllerWithTable *vc = [[ViewControllerWithTable alloc] init];
            [vc updateEverything];

テーブルビューを表示した元のViewControllerとはまったく関係のない、新しいViewControllerをインスタンス化しています。したがって、更新メッセージを間違ったオブジェクトに送信しています。

必要なのは、メッセージを送信するのに適切なコントローラーがどれであるかをセルが認識するためのメカニズムです。

簡単な解決策の1つは、次を使用することNSNotificationCenterです。

  1. ビューコントローラは、特定の種類の通知のためにそれ自体を登録します。

    [[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(updateEverything:)
    name:kCellSentUpdateMessageNotification
    object:nil];
    
  2. メッセージを直接呼び出す代わりに、セルが通知を送信します。

    [[NSNotificationCenter defaultCenter] postNotificationName:kCellSentUpdateMessageNotification object:nil];
    

古い答え:

あなたは電話する必要があります

  [self.tableView reloadData]

updateEverythingメソッドの実装から。これにより、テーブルデータが再読み込みされ、行の外観が効果的に更新されます。これupdateEverythingが機能するためには、ボタンを続けてタップするときにメソッドが呼び出されることは明らかです。

それでも問題が解決しない場合は、コードを追加してください。

于 2012-06-05T08:24:30.130 に答える
0

入れてみましたか

[[self tableView] reloadData];

私はそのような問題を抱えていたのを覚えています、そして上のこの行は私の問題を解決します。

于 2012-06-05T08:29:13.230 に答える
0

これがあなたの問題です:

ボタンのメソッドはカスタムセルクラスにあるため、ビューコントローラー(テーブルビューを持つもの)をインスタンス化し、ビューとテーブルビューのいくつかのラベルを更新するためのメソッドを実行しようとしました。

テーブルビューの知識がないまったく新しいビューコントローラを作成しました。最善の方法は、セルサブクラスにプロパティを作成し、セルを設定するときにそれをViewControllerに設定することです。次に、そのプロパティでupdateEverythingメソッドを呼び出すことができます。

于 2012-06-05T08:43:51.697 に答える