NSTableView reloadData - исключение индекса за пределами границ

пожалуйста, простите меня за то, что отнял у вас время, но я потратил много времени и перепробовал все, что было в моей голове и что я нашел в Интернете :/

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

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

Теперь я хочу показать код того, что я пытаюсь сделать.

Итак, вот как моя таблица получает данные

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

и вот как я пытаюсь перезагрузить данные при создании нового файла:

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

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

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

Спасибо за помощь!


person MartyMcFly    schedule 19.02.2014    source источник
comment
Я не понимаю ваш код. Является ли [TxtFileObj GetFilesList]; методом класса? Это выглядит совсем не так.   -  person trojanfoe    schedule 19.02.2014
comment
Также, пожалуйста, опубликуйте свой фактический код. return cell view; не будет компилироваться.   -  person trojanfoe    schedule 19.02.2014
comment
@trojanfoe ty за внимание к моей проблеме, [TxtFileObj GetFilesList]; — это метод экземпляра. Это мой фактический код, и он отлично компилируется.   -  person MartyMcFly    schedule 19.02.2014
comment
@MartyMcFly обычно начинаются со строчной буквы, кроме того, get немного устарел, потому что что-то вроде [NSObject fileList] говорит само за себя.   -  person    schedule 19.02.2014
comment
@DigiMonk, сэр! Я буду иметь ввиду.   -  person MartyMcFly    schedule 19.02.2014
comment
Что ж, ваш код выглядит нормально (кроме недопустимого return cell view и странного использования заглавных букв). Не уверен, что предложить, кроме регистрации использования row в ваших делегатах tableview и возврата [FilesArray count] в numberOfRowsInTableView: (нет необходимости в filesCount).   -  person trojanfoe    schedule 19.02.2014
comment
@trojanfoe ty, извините за return cell view, это была моя ошибка при вставке кода, на самом деле это return cellview.   -  person MartyMcFly    schedule 19.02.2014


Ответы (1)


Итак, почитав несколько форумов, я наконец нашел свою ошибку :)

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

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];
person MartyMcFly    schedule 20.02.2014