- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程式
我的应用程序的目的是为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;
}
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/
我是一名优秀的程序员,十分优秀!