4

NSMutableArrayがあり、そこからテーブルビューをロードします。これで、UIにボタンがあり、ユーザーが配列に入るデータを複数回更新できるようになりました。そして、配列に新しいデータがあるたびに、tableViewを更新したいと思います。配列を更新した後に[tableViewreloadData]を実行するだけで、ビーチボールが発生するようです。これを達成するための良い方法は何でしょうか?

また、配列からNSTableViewを実装する方法としてバインディングを検討してきましたが、オンラインで示されているすべての例では、テーブルにデータを追加するときにバインディングを使用していますか?バインディングを使用してデータを含む配列をtableViewにロードする方法を誰かに教えてもらえますか?

質問が初心者の質問である場合は申し訳ありませんが、誰かが私に正しいデータを教えてくれるかどうかを読んで喜んでいます。ありがとう:)(私は近道を探していません、ただこれらのものにアプローチする方法について経験豊富な人々からいくつかの学んだアドバイスを得ようとしています)

-(IBAction)refreshList:(id)sender
{
//setup array here and sort the array based on one column. This column has 
  identifier 'col1' and it works as expected


[aTable reloadData];
  } 

- (int) numberOfRowsInTableView:(NSTableView *)aTable
{ // return count of array
 }

- (id)tableView:(NSTableView *)aTable objectValueForTableColumn: (NSTableColumn *)          
tableColumn row:(int)row
 { 
 //set up arrays here to load data in each column


 }
- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray   
 *)oldDescriptors
 {
 //sort here when column headers are clicked
 } 

 -(IBAction)autorefresh:(id)sender
   {

 // Here i am trying to reload the array and refresh the tableView. I want to       
  constantly keep refreshing the array and loading the tableView here. The array does 
  get   refreshed but I am having trouble loading the tableView.


  for ( int i =0; i<=2;i++)
  { 
     // reload the array with data first.
  [aTable reloadData];
    i = 1;

  } 
4

2 に答える 2

1

-reloadDataビーチボールを引き起こしている場合は、ほぼ確実に、コントローラーのNSTableDataSourceプロトコルの実装に問題があることを意味します。これが発生している理由を解明し、修正する必要があります。テーブルのデータソースコードを投稿すると、その理由を理解するのに役立つかもしれません。

NSTableViewバインディングを確認する前に、「標準」のデータソースとデリゲートメソッドに精通することを強くお勧めします。Cocoa Bindingsは比較的高度なトピックであり、バインディングに進む前に、より基本的なCocoaエクスペリエンスが必要なようです。

そうは言っても、このページには、Cocoaバインディングの例の包括的なセットがあります。

http://homepage.mac.com/mmalc/CocoaExamples/controllers.html

コードを投稿してから更新します。

投稿したコードは警告なしにコンパイルされないため、上記のコードではデータソースメソッドの実装を意図的に省略していると想定する必要があります。

自動更新メソッドは無限ループです。それはビーチボールを説明するでしょう。iループの各反復で1に設定しています。これは、終了条件に到達しないことを意味します。

ただし、forこのようなループを使用することは、テーブルビューを更新するためのひどい、ひどい方法であり、メインスレッドをブロックします。テーブルビューを定期的に繰り返し更新する必要がある場合はNSTimer、指定された間隔で呼び出されるを使用してください。

于 2010-01-11T05:57:04.267 に答える
1

そのコード(そして特にあなたの非常に斬新な「真の」ループ)では、男の実行ループに戻ることは決してないので、ビーチボールを手に入れることができます。NSTableViewを設定した後、このようなコードを使用すると、1.0秒ごとに実行されます。

NSTimer* timer = [NSTimer timerWithTimeInterval:1.0
                                         target:[NSApp delegate]
                                       selector:@selector(myReloadData:)
                                       userInfo:nil
                                        repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];  

次に、アプリデリゲートでmyReloadDataを作成します

- (void)reloadMyData:(NSTimer*)ntp
{
  // reload the array with data first.
  [aTable reloadData];
}
于 2010-01-16T16:53:55.033 に答える