使用新数据多次刷新NSTableView

时间:2010-01-10 22:30:52

标签: objective-c cocoa nstableview

我有一个NSMutableArray,我从中加载了我的tableview。现在我在UI中有一个Button,它允许用户多次刷新进入数组的数据。 每次在Array中有新数据我想刷新tableView。 只是在更新阵列后执行[tableView reloadData]似乎带来了沙滩球。 关于什么是实现这个目标的好方法的想法?

此外,我一直在研究绑定作为一种从阵列实现我的NSTableView的方法,但是当他们想要将数据添加到他们的表时,在线显示的所有示例都使用绑定吗? 任何人都可以指出我如何使用Bindings将数据加载到tableView中?

对不起,如果问题是noobie问题,我愿意阅读是否有人能指出我正确的数据。谢谢:)(我不是在寻找捷径,只是想从经验丰富的人那里获得一些有关如何处理这些事情的建议)

-(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;

  } 

2 个答案:

答案 0 :(得分:1)

如果-reloadData造成了一个沙滩球,那几乎可以肯定意味着您的控制器实施NSTableDataSource协议有问题。你需要找出发生这种情况的原因并加以解决。如果您发布了表数据源代码,那么我们可以帮助您找出原因。

我强烈建议您在查看绑定之前熟悉“标准”NSTableView数据源和委托方法。 Cocoa Bindings是一个相对高级的主题,听起来你需要更多基本的Cocoa经验才能继续绑定。

也就是说,这个页面有一套全面的Cocoa绑定示例:

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

自您发布代码后更新:

我必须假设您故意在上面的代码中省略了数据源方法的实现,因为发布它的代码在没有警告的情况下将无法编译。

您的autorefresh方法是一个无限循环。这可以解释海滩球。您在循环的每次迭代中将i设置为1,这意味着永远不会达到结束条件。

然而,使用这样的for循环是刷新表视图的一种可怕,可怕的方法,并将阻止主线程。如果您需要定期重复更新表视图,请使用以指定间隔调用的NSTimer

答案 1 :(得分:1)

使用该代码(特别是你的非常新颖的“while true”循环),你会得到一个沙滩球,因为你永远不会回到男人的跑步循环。在设置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];  

然后在您的app delegate

中创建myReloadData
- (void)reloadMyData:(NSTimer*)ntp
{
  // reload the array with data first.
  [aTable reloadData];
}