OK, quindi vuoi un NSOutlineView
con celle ImageAndTextCell
, giusto?
Facciamo uno degli esempi più tipici di questo tipo: un semplice file explorer.
Ciò di cui abbiamo bisogno:
- un
NSOutlineView
(mettere un contorno al vostro AppDelegate, come fileOutlineView
)
- creare 3 colonne della Outline con i seguenti identificatori (li istituito nel Interface Builder):
NameColumn
, SizeColumn
, ModifiedColumn
Ora, come per il resto, farò tutto a livello di codice, in modo da di avere una buona idea di cosa sta succedendo ...
Come configurarlo (ad es. in - (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];
Connecting the Dots:
/*******************************************************
*
* 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];
}
}
}
Suggerimento:ImageAndTextCell
classe può essere trovato here. Noterete anche un paio di altri metodi che sto usando, che sono, ovviamente, non supportati da cacao (ad es isFileHidden
, isFolder
o folderContentsWithPathAndBackIgnoringHidden
), ma non è così difficile da attuare da soli ...)
fonte
2012-04-23 06:39:42
Non vedo come sia corretto. ImageAndTextCell è di tipo NSCell, NOT NSView. La domanda riguardava una vista NSOutlineView basata. Il tuo esempio riguarda la creazione di una sottoclasse NSCell personalizzata che siamo stati in grado di fare per anni. Per NSTableView ci sono molti esempi su come usare NSView invece di NSCell. Somiglia molto a iOS. Non ho trovato nessun esempio di NSOutlineView tristemente. –
@ Le tabelle basate su Adam view utilizzano NSTableCellViews come viste. Da lì puoi aggiungere qualsiasi contenuto a loro. Quello che ha detto Dr. Kameleon è esattamente giusto. L'intero punto di vista delle tabelle basate è che è possibile aggiungere qualsiasi oggetto vista desiderato (sia esso una cella, pulsante, immagine bene ... qualunque cosa) – Patrick
Non si tratta di creare una vista struttura basata sulla vista. – JeremyP