NSTableView НЕ БУДЕТ ПЕРЕЗАГРУЗИТЬ - PullRequest
0 голосов
/ 13 января 2011

Привет, ребята, поэтому в моей новейшей программе я использую NSTableView для отображения слов слева и их определений справа.Эти слова и определения загружаются из файла .plist, и при запуске приложения табличное представление загружает эти слова и определения и отображает их очень хорошо.Моя проблема возникает, когда пользователь пытается добавить слово и определение, используя текстовые поля и кнопки, слово фактически добавляется в .plist, что означает, что метод работает нормально, но табличное представление отказывается отображать новую строку.только после того, как я выйду из программы и снова открою ее, табличное представление отобразит новую строку.Я проверил, правильно ли было подключено табличное представление, отправив ему другие сообщения, такие как selectedRow и dataSource, все вернулись с ответами, и при этом правильно ответили.В настоящее время класс, который используется в качестве источника данных и делегата, является подклассом моего основного класса со всеми моими переменными и словарями.(Я хорошо использую как можно меньше уроков).Наконец, я попытался вставить noteNumberOfRowsChanged в перед reloadData, но все еще ничего.

Я все протестировал, и кажется, что метод reloadData ничего не инициирует.Как я уже сказал, моему табличному представлению отправляется сообщение, новая информация фактически добавляется в массив adnitinoary adn, количество строк обновляется методом count, и что еще больше доказывает то, что когда программаперезапустил все отображает просто отлично.ниже приведен соответствующий код, где currentWordList и currentDefitionList - это массив и словарь, передающий данные в dataSource, а editLibraryCardList - это NSTableView, который я пытаюсь перезагрузить.

код класса dataSource:

@interface EditorDataTable : SAT_Vocab_MacController {
    IBOutlet NSTableColumn *editLibraryWordColumn;
    IBOutlet NSTableColumn *editLibraryDefinitionColumn;
}

- (int)numberOfRowsInTableView:(NSTableView *)tableView;

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row;

@end

@implementation EditorDataTable

- (int)numberOfRowsInTableView:(NSTableView *)tableView {
    return ([currentWordList count]);
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row {
    if (tableColumn == editLibraryWordColumn) {
        return [currentWordList objectAtIndex:row];
    }
    if (tableColumn == editLibraryDefinitionColumn) {
        return [currentDefinitionList valueForKey:[[currentWordList objectAtIndex:row]lowercaseString]];
    }
}

@end

метод, который добавляет слово в список:

- (IBAction) editLibraryAddWordToLibrary: (id) sender {

    if (self = [super init]) {
        currentWordList = [[NSArray alloc] initWithContentsOfFile:userSATWordListPath];
        currentDefinitionList = [[NSDictionary alloc] initWithContentsOfFile:userSATDefinitionListPath];
    }

    [currentWordList addObject:[[editLibraryNewCardWordInput stringValue]capitalizedString]];
    [currentDefinitionList setObject:[editLibraryNewCardDefinitionInput stringValue] forKey:[[editLibraryNewCardWordInput stringValue]lowercaseString]];

    aWordCounter = [currentWordList indexOfObject:[[editLibraryNewCardWordInput stringValue]capitalizedString]];

    [aWordLabel setStringValue: [[NSString alloc] initWithFormat:@"%@", [currentWordList objectAtIndex: aWordCounter]]];
    [aDefinitionLabel setStringValue: [[NSString alloc] initWithFormat:@""]];

    [currentWordList writeToFile:userSATWordListPath atomically:YES];
    [currentDefinitionList writeToFile:userSATDefinitionListPath atomically:YES];

    [cardCountdownNumber setStringValue: [[NSString alloc] initWithFormat:@"%i", ([currentWordList count] - (1 + aWordCounter))]];

    [editLibraryCardList noteNumberOfRowsChanged];
    [editLibraryCardList reloadData];
}

Я застрял на несколько дней, и любые идеи помогут!Спасибо.

Зак

Ответы [ 2 ]

0 голосов
/ 15 января 2011

Для тех, кому интересно, я переместил свой код из подкласса dataSource в основной класс, и это сработало.Я думаю, вы не можете подклассы dataSource.Надеюсь, это поможет!

0 голосов
/ 13 января 2011

Вы пробовали отладку в своем методе selectRowAtIndexPath, чтобы убедиться, что происходит перезагрузка? (после вызова [tableView reloadData] должно быть видно это) Используете ли вы UITableViewController?

Если вы хотите, чтобы обратный вызов после перезагрузки знал, когда это будет сделано, вы можете попробовать:

[tableView reloadData];
    [self performSelector:@selector(selectRowAtIndexPath:) withObject:indexPath afterDelay:0.0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...