gpt4 book ai didi

macos - 初次出现后在NSOutlineView中更新单元

转载 作者:行者123 更新时间:2023-12-03 16:41:38 26 4
gpt4 key购买 nike

我的应用程式

我的应用程序的目的是为WWDC视频下载字幕文件。在视频和幻灯片文件所在目录的大子目录中,字幕可以作为名为“ fileSequence0.webvtt”,“ fileSequence1.webvtt”等的WebVTT文件使用。

如果您有任何WWDC视频(或幻灯片)文件,则可以获取从中下载的URL,去除文件名,添加必要的额外路径组件以创建字幕URL,然后下载该字幕文件-这就是我的目的。应用程序。

我的模特

尽管我最初设想的是两层模型,但最终我得到了一个单一的平面列表,因此目前我只是将大纲视图用作普通表视图,没有任何子项。

我的项目是下载源,每个都有以下属性:


影片档案名称
当前字幕文件索引(从0开始)
当前下载进度分数(每个字幕文件从0到1的进度)
下载的所有字幕文件(bool),此后称为“完成”


当我将视频文件输入我的应用程序时,它会创建一个下载源,该源依次产生每个字幕文件的远程URL。我的应用程序会下载每个字幕文件,并随即更新“下载源”的状态。

我的应用无法知道有多少个字幕文件。它所知道的只是它们已编号。因此,当它收到404时,它知道它已经下载了该视频文件的所有字幕文件,因此它将“下载源”标记为“完成”,然后继续进行下一个“下载源”(如果有)。

如何填充大纲视图

我的窗口控制器是我的大纲视图的数据源和委托。

大纲视图是基于视图的。在行视图中,四个单元格视图中的三个绑定到其对象值的属性:


第一列中的文本字段绑定到视频文件名。
第二列中的文本字段绑定到当前字幕文件索引。
第三列中的进度条与进度分数绑定。


第四列显示图像视图,这就是困难所在。

因为我不想用“ doneImage”属性污染我的模型(我觉得那是控制器业务),所以我让控制器在返回单元格视图时设置图像视图的图像:

- (NSView *) outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
NSTableCellView *cellView = [outlineView makeViewWithIdentifier:tableColumn.identifier owner:self];
PRHVideoFileDownloadSource *downloadSource = item;
cellView.objectValue = downloadSource;
if ([tableColumn.identifier isEqualToString:@"done"]) {
NSLog(@"Source %@ is done: %@", downloadSource, downloadSource.complete ? @"true" : @"false");
cellView.imageView.image = downloadSource.complete ? [NSImage imageNamed:@"Done"] : nil;
}
return cellView;
}


问题

最初,这很好。如果我删除测试模型对象是否完成的条件,则“完成”图像看起来很好(因此,我知道该图像已被复制,它是有效的图标,列的标识符已正确设置,等等)。

但是,在这种情况下,即使“下载源”完成后,该图像也永远不会出现。

您可以看到我添加了一个NSLog。 (每行)仅出现一次:

2013-07-22 15:46:18.028 WWDC Subtitles Fetcher[7980:1307] Source <PRHVideoFileDownloadSource 0x7fd6f533d340 "404-Advances in Objective-C.pdf"> is done: false
2013-07-22 15:46:18.035 WWDC Subtitles Fetcher[7980:1307] Source <PRHVideoFileDownloadSource 0x10b372190 "405-Interface Builder Core Concepts-SD.mov"> is done: false


通过绑定到单元格视图的 objectValue的属性填充的单元格都可以正常工作。仅未绑定其内容视图的此单元格不会更新。

我尝试过的

如您在上面看到的,我已经尝试在调用 outlineView:viewForTableColumn:item:时进行记录。每行只调用一次;再也不。

所以,也许我需要提示它重新加载这些行,对吗?我在将下载源标记为完成的行之后立即添加了 reloadItem:消息。没有骰子-确实可以实现(我有另一个bug,自修复以来,在执行该操作时导致了异常),但是Outline视图没有提示,并要求我重新创建/更新该视​​图。

我还尝试将图像视图绑定到单元格视图的 objectValue并实现 outlineView:objectValueForTableColumn:byItem:

//Revised outlineView:viewForTableColumn:item: that doesn't set the cell view's objectValue
- (NSView *) outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
NSTableCellView *cellView = [outlineView makeViewWithIdentifier:tableColumn.identifier owner:self];
return cellView;
}

//Return the Done image for the “done” column; return the Download Source for all other columns (whose cells' content views are bound to properties of the Download Source)
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
PRHVideoFileDownloadSource *downloadSource = item;
if ([tableColumn.identifier isEqualToString:@"done"]) {
NSLog(@"Source %@ is done: %@", downloadSource, downloadSource.complete ? @"true" : @"false");
return downloadSource.complete ? [NSImage imageNamed:@"Done"] : nil;
}
return downloadSource;
}


尽管这比较干净,但我认为我会保留它,但它不能解决问题-尽管 objectValueForTableColumn:byItem:reloadItem:方法同样只被调用过一次,因此没有机会分配图像作为该单元格的新 objectValue

我需要的

我需要一种方法(有效)告诉大纲视图“此特定行已更改;请更新其 objectValue”,或者甚至更好的一种方法来告诉它该行中的特定单元格已更改。

最佳答案

而不是返回“完成”列的选中标记图像以及其他列的下载源,而是返回所有列的下载源。然后使用NSNegateBoolean值转换器将图像视图的“隐藏”绑定绑定到下载源的“ complete”属性。当您的模型触发KVO通知时,这将允许图像显示或隐藏自身,因此您不必刷新项目并希望将其更新为所需的方式。

关于macos - 初次出现后在NSOutlineView中更新单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17800209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com