NSTableView不会重新加载

时间:2011-01-13 09:40:40

标签: objective-c nstableview

嘿伙计们,所以在我最新的程序中,我使用NSTableView来显示左边的单词,而使用右边的定义。这些单词和定义是从.plist文件加载的,在应用程序启动时,表视图会加载这些单词和定义并显示它们。我的问题出现在用户尝试使用文本框和按钮添加单词和定义时,该单词实际上已添加到.plist中,这意味着该方法运行正常,但表视图拒绝显示新行。直到我退出程序并重新打开它之后,tableview才显示新行。我通过发送其他消息(例如selectedRow和dataSource)来测试表视图是否正确连接,所有消息都返回响应,并且正确响应。目前,用作dataSource和delegate的类是我的主类的子类,包含我的所有varibles和dictionaries。 (我很擅长使用尽可能少的课程)。最后我尝试在reloadData之前插入noteNumberOfRowsChanged,但仍然没有。

我测试过所有内容,看起来reloadData方法似乎没有启动任何内容。就像我说的那样,我的表视图正在发送消息,新信息实际上被添加到dicitinoary adn数组中,行数正在通过count方法更新,更有证据的是当程序是重新启动它显示一切都很好。下面是相关代码,其中currentWordList和currentDefitionList是将数据提供给dataSource的Array和Dictionary,而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 :(得分:0)

您是否尝试过调试selectRowAtIndexPath方法以确保重新加载? (调用[tableView reloadData]之后应该能看到这个)你在使用UITableViewController吗?

如果您想在重新加载后进行回调以了解其完成时间,您可以尝试:

[tableView reloadData];
    [self performSelector:@selector(selectRowAtIndexPath:) withObject:indexPath afterDelay:0.0];

答案 1 :(得分:0)

对于那些好奇的人,我将我的代码从dataSource子类移到了主类,并且它有效。我猜你不能继承dataSource。希望这有帮助!