出于学习目的,我想将基于单元格的NSOutlineView转换为基于视图的NSOutlineView,
基本上我想要以下内容:
NSTreeController
这是世界上最简单的NSOutlineView'例如http://www.cocoasteam.com/Cocoa_Steam/Worlds_Simplest_Demo.html
我想知道是否有人可以修改它以使其基于视图并像我上面说的那样工作:):)
我已经尝试过查看苹果示例,并在互联网上搜索其他地方,但我仍然无法让它工作 - 所以非常感谢提前:)
答案 0 :(得分:10)
好的,所以你想要NSOutlineView
个ImageAndTextCell
个单元格,对吗?
让我们做一个最典型的例子:一个简单的文件浏览器。
我们需要什么:
NSOutlineView
(为您的AppDelegate添加大纲,fileOutlineView
)NameColumn
,SizeColumn
,ModifiedColumn
现在,至于其余部分,我会以编程方式完成所有操作,以便您了解正在发生的事情......
如何设置(例如在- (void)awakeFromNib
中):
// set the Data Source and Delegate
[fileOutlineView setDataSource:(id<NSOutlineViewDataSource>)self];
[fileOutlineView setDelegate:(id<NSOutlineViewDelegate>)self];
// set the first column's cells as `ImageAndTextCell`s
ImageAndTextCell* iatc = [[ImageAndTextCell alloc] init];
[iatc setEditable:NO];
[[[fileOutlineView tableColumns] objectAtIndex:0] setDataCell:iatc];
连接点:
/*******************************************************
*
* OUTLINE-VIEW DATASOURCE
*
*******************************************************/
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
if ([item isFolder])
return YES;
else
return NO;
}
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
if (item==nil)
{
// Root
return [[filePath folderContentsWithPathAndBackIgnoringHidden] count];
}
else
{
if ([item isFolder])
{
return [[item folderContentsWithPathAndBackIgnoringHidden] count];
}
else
{
return 0;
}
}
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
{
if (item == nil)
{
// Root
return [[filePath folderContentsWithPathAndBackIgnoringHidden] objectAtIndex:index];
}
if ([item isFolder])
{
return [[item folderContentsWithPathAndBackIgnoringHidden] objectAtIndex:index];
}
// File
return nil;
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)theColumn byItem:(id)item
{
if ([[theColumn identifier] isEqualToString:@"NameColumn"])
{
return [item lastPathComponent];
}
else if ([[theColumn identifier] isEqualToString:@"SizeColumn"])
{
if ([item isFolder]) return @"--";
else return [NSString stringWithFormat:@"%d",[item getFileSize]];
}
else if ([[theColumn identifier] isEqualToString:@"ModifiedColumn"])
{
if ([item isFolder]) return @"";
else return [NSString stringWithFormat:@"%@",[item getDateModified]];
}
// Never reaches here
return nil;
}
/*******************************************************
*
* OUTLINE-VIEW DELEGATE
*
*******************************************************/
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item
{
return YES;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item
{
return NO;
}
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item {
[cell setDrawsBackground:NO];
if ([item isFileHidden]) [cell setTextColor:[NSColor grayColor]];
else [cell setTextColor:[NSColor whiteColor]];
if ([[tableColumn identifier] isEqualToString:@"NameColumn"])
{
if ([item isFolder])
[cell setImage:[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)] size:15.0];
else
[cell setImage:[[NSWorkspace sharedWorkspace] iconForFile:item] size:15.0];
if ([item isFileHidden])
{
[cell setFileHidden:YES];
}
else
{
[cell setFileHidden:NO];
}
}
}
提示: ImageAndTextCell
类可以找到here。您还会注意到我正在使用的其他几种方法,Cocoa显然不支持这些方法(例如isFileHidden
,isFolder
或folderContentsWithPathAndBackIgnoringHidden
)但是自己实现它们并不困难。 ...)
答案 1 :(得分:9)
我创建了一个小样本项目。
在github上查看besi/mac-quickies。 大部分内容可以在IB中完成,也可以在AppDelegate
中找到
答案 2 :(得分:1)
将视图返回到OutlineView列而不是使用返回objectValue的数据源方法:
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)theColumn byItem:(id)item
使用DATASOURCE方法返回视图!!!!!!!!:
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
其他一切都是一样的(最小req是前三个数据源方法,你不需要委托方法)但是, 你不能使用它只调用基于单元格的willdisplaycell,在viefortablecolumn方法中对视图做所有事情都是这样的:
if ([[tableColumn identifier] isEqualToString:@"YourColumnIdentifier"]){
NSTableCellView *cell = [outlineView makeViewWithIdentifier:@"YourViewsIdentifier" owner:self];
[cell.textField setStringValue:[(YourItem *)item name]];
[cell.imageView setImage:[(YourItem *)item image]];
return cell;
}
return nil;
并且不要忘记设置标识符,并将OutlineView设置为基于视图(在IB ...中)。
答案 3 :(得分:0)
从WWDC 2011检查TableViewPlayground,还基于View的NSTableView Basic to Advanced 。