несколько раз обновлять NSTableView новыми данными - PullRequest
4 голосов
/ 11 января 2010

У меня есть NSMutableArray, и я загружаю из него свое табличное представление. Теперь у меня есть кнопка в пользовательском интерфейсе, которая позволяет пользователю обновлять данные, которые поступают в массив несколько раз. И каждый раз, когда в массиве появляются новые данные, я хочу обновить tableView. Простое выполнение [tableView reloadData] после обновления массива, похоже, вызывает пляжный мяч. Любые идеи о том, что было бы хорошим способом для достижения этой цели?

Также я рассматривал привязки как способ реализации моего 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;

  } 

Ответы [ 2 ]

1 голос
/ 16 января 2010

С этим кодом (и особенно с вашим самым новым циклом "while true") вы получаете надувной мяч, потому что вы никогда не вернетесь к циклу выполнения man. Чтобы исправить, используйте такой код после настройки 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];
}
1 голос
/ 11 января 2010

Если -reloadData вызывает пляжный мяч, это почти наверняка означает, что что-то не так с реализацией протокола NSTableDataSource вашего контроллера. Вы должны выяснить, почему это происходит, и исправить это. Если вы опубликуете исходный код данных таблицы, возможно, мы поможем вам понять, почему это так.

Я настоятельно рекомендую вам ознакомиться со "стандартными" NSTableView источниками данных и методами делегирования, прежде чем даже смотреть на привязки. Привязки какао - это довольно продвинутая тема, и, похоже, вам нужно больше основополагающих навыков работы с какао, прежде чем переходить к привязкам.

Тем не менее, эта страница содержит полный набор примеров привязки какао:

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

Обновление с момента публикации вашего кода:

Я должен предположить, что вы сознательно исключили реализацию методов источника данных в приведенном выше коде, поскольку код, который вы опубликовали, не будет компилироваться без предупреждений.

Ваш метод автообновления представляет собой бесконечный цикл. Это объяснило бы пляжный мяч. Вы устанавливаете i в 1 на каждой итерации цикла, что означает, что конечное условие никогда не достигается.

Однако использование цикла for, подобного этому, является ужасным, ужасным способом обновления табличного представления и блокирования основного потока. Если вам необходимо регулярно обновлять табличное представление, используйте NSTimer, который вызывается через указанный интервал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...