2012-04-13 3 views
0

から挿入してくださいこれはばかげているようですが、私はそれを並べ替えることはできません。プッシュ通知に応答して、テーブルビューに行を挿入する必要があります。実装は、UITableViewの行をコード

- (void)didSaveMessage:(Message*)message atIndex:(int)index 
{ 
//check to make sure I have an array to populate the table from... 
    if (self.messageManager.messages != nil) 
    { 
     self.indexRow = index; 
     NSLog(@"refresh table view from code"); 
     //remove a label that says "You have no messages"... 
     [[messageTable tableFooterView] removeFromSuperview]; 

     [messageTable beginUpdates]; 
     [messageTable insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]] 
          withRowAnimation:UITableViewRowAnimationFade]; 
     [messageTable endUpdates]; 

     [self scrollToNewestMessage]; 

    } 
} 

のように単純にする必要があります。このメソッドは、リモート通知を受け取ったときに呼び出され、起動します。ログステートメントが印刷されます。ただし、UITableViewは更新されません。私にとって特に奇妙なのは、同じコードをIBActionに入れて、それをストーリーボードの更新ボタンにリンクすると、それが機能するということです。プログラムでUITableViewを更新するために何か特別なことがありますか?

+2

更新の呼び出しが呼び出される前に、データソースがこの新しい行のデータで既に更新されていることを確認してください。私はあなたがテーブルに行をアニメーション化し、あなたのデータソースに行を追加することは離散的なアクションであることを知っていると仮定しています。 –

+0

はい、ありがとうございます。 insertRowsAtIndexPaths:withAnimationを呼び出す前にテーブルを移入するために使用している配列の数を記録すると、予想される更新回数が得られます。その部分はうまくいくようです。また、新しい行を挿入しようとしたときに自分のデータソースがまだ更新されていないと、NSExceptionが発生し、クラッシュする可能性があります。 – geraldWilliam

+0

良い点は、 'NSInternalInconsistencyException'をスローします。追加される行よりもテーブルの下にある場合は、正しい行にスクロールしますか?また、スーパービューからtableFooterViewを削除することは、それが 'UITableView'のビュー階層の一部であるため、素晴らしい考えです。おそらくそれを代わりに 'nil'に設定するでしょう。これは、ボタンで起動するとうまくいくようです... –

答えて

0

これが解決されました。私はdidReceiveRemoteNotificationからUIを更新するメソッドを呼び出していました:AppDelegateでは、しかし、私のビューコントローラの別のインスタンスに。だから私はviewControllerプロパティをアプリケーションデリゲートに追加し、ビューコントローラのビューに値を設定してロードしましたが、今はすべて動作しています。

1

reloadDataというメッセージを送信してください。これにより、テーブルビューが強制的に更新されます。

+0

ダイスはありません。ご回答いただきありがとうございます。私は、代わりに、そして、insertRowsAtIndexPaths:withAnimation:に加えて、reloadDataを試みました。結果は同じで、テーブルは更新されません。ビューから離れて戻ってきた場合、viewWillAppearのreloadData呼び出しはテーブルのすべてのメッセージを正しくロードし、前述したようにUIEventへの応答として機能します。しかし、コードからではありません。 – geraldWilliam

0

これはかなり簡単ですが、didSaveMessageに渡しているMessage *がゼロである可能性がありますか?なぜNSLogステートメントが機能するのかを説明し、IBActionからテストするときに手動でメッセージを作成しなければならないと仮定します。

+0

お返事ありがとうございます。メッセージをコンソールに記録すると、期待どおりに存在します。そして、IBActionからテストするとき、私はプッシュ通知を介してメッセージを送信していましたが、didReceiveRemoteNotificationの応答ではなく、最新のボタンをロードしています: – geraldWilliam

関連する問題