嘿伙计们,所以在我最新的程序中,我使用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];
}
我被困了几天,任何想法都会有所帮助!感谢。
扎克
答案 0 :(得分:0)
您是否尝试过调试selectRowAtIndexPath方法以确保重新加载? (调用[tableView reloadData]之后应该能看到这个)你在使用UITableViewController吗?
如果您想在重新加载后进行回调以了解其完成时间,您可以尝试:
[tableView reloadData];
[self performSelector:@selector(selectRowAtIndexPath:) withObject:indexPath afterDelay:0.0];
答案 1 :(得分:0)
对于那些好奇的人,我将我的代码从dataSource子类移到了主类,并且它有效。我猜你不能继承dataSource。希望这有帮助!