2014-02-19 1 views
0

пожалуйста, прости меня за то, что нашли время, но я потратил много времени, и перепробовал все, что было в моей голове, и что я нашел в интернете:/NSTableView reloadData - индекс за исключением ограничивающей

Проблема в том о перезапуске NSTableView после добавления 1 записи в свой массив. Мое приложение начинается с каталога сканирования для файлов, добавляя их имена и измененные даты в NSMuttableArray из NSDictionaries. Затем загрузите эту информацию в NSTableView, и все будет хорошо. Но когда I'am создания нового файла и пытается перезагрузить NStableViev I'am получаю это:

[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4] 

Теперь я хочу показать некоторый код, что I'am пытается сделать.

Так вот как мой стол получать данные

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{ 
    NSLog(@"--------->%ld",(long)filesCount); 
    return filesCount; 
} 

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn 
        row:(NSInteger)row { 
    NSDictionary *flag = FilesArray[row]; 
    NSString *identifier = [tableColumn identifier]; 

    if ([identifier isEqualToString:@"filename"]){ 
     NSTableCellView *cellview = [tableView makeViewWithIdentifier:@"filename" owner:self]; 
     [cellview.textField setStringValue:flag[@"name"]]; 
     return cellview; 

    }else if ([identifier isEqualToString:@"filedate"]){ 
     NSTableCellView *cellview = [tableView makeViewWithIdentifier:@"filedate" owner:self]; 
     [cellview.textField setStringValue:flag[@"date"]]; 
     return cellview; 
    } 
    return nil; 
} 

и вот то, что, как i'am пытается перезагрузить данные при создании нового файла:

if([identifier isEqualToString:@"newFileModalDone"]){ 
     NSString *newFileName = [self fileNameModalDone]; 
//creating new file 
     [TxtFileObj WriteToFile:[newFileName stringByAppendingString:@".txt"] :nil]; 
//rescaning directory 
     [TxtFileObj GetFilesList]; 
     FilesArray = [TxtFileObj GetFileArray]; 
//updating files count 
     filesCount = [FilesArray count]; 

     [FilesListTable reloadData]; 

} 

я пытался смотреть отладчик много и кажется, что исключения исходят от

NSDictionary *flag = FilesArray[row]; 

поэтому я думал о неправильном размере массива a чтобы создать новый фильм, но я проверил его много раз, и все было в порядке.

Пожалуйста, помогите мне узнать, что я делаю неправильно, извините, если проблема очевидна, я очень новичок в Objective C и COCOA.

Благодарим за помощь!

+1

Я не понимаю ваш код. Является '[TxtFileObj GetFilesList];' метод класса? Это совсем не так. – trojanfoe

+0

Также, пожалуйста, разместите свой фактический код. 'return cell view;' не будет компилироваться. – trojanfoe

+0

@trojanfoe для просмотра моей проблемы, '[TxtFileObj GetFilesList];' является методом экземпляра. Это мой фактический код, и он отлично компилируется. – MartyMcFly

ответ

0

Таким образом, после прочтения некоторых форумах я наконец-то нашел свою ошибку :)

Не уверен, если его правильно, но теперь его работает отлично, теперь код выглядит следующим образом:

if([identifier isEqualToString:@"newFileModalDone"]){ 
     NSString *newFileName = [self fileNameModalDone]; 
     [FilesListTable beginUpdates]; 
     [TxtFileObj writeToFile:[newFileName stringByAppendingString:@".txt"] :nil]; 
     [TxtFileObj getFilesList]; 
     FilesArray = [TxtFileObj filesListArray]; 
     [FilesListTable insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:[FilesArray count]-1] 
           withAnimation:NSTableViewAnimationSlideDown]; 

     [FilesListTable endUpdates]; 
     [FilesListTable reloadData]; 
    } 

то, что я в принципе ничего добавлено 3 метода:

[FilesListTable beginUpdates]; 

[FilesListTable insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:[FilesArray count]-1] 
            withAnimation:NSTableViewAnimationSlideDown]; 

[FilesListTable endUpdates];