OK, vì vậy bạn muốn có một NSOutlineView
với các ô ImageAndTextCell
, phải không?
Hãy làm một trong những ví dụ điển hình nhất của loại này: một trình khám phá tệp đơn giản.
Những gì chúng ta sẽ cần:
- một
NSOutlineView
(đặt một phác thảo để appdelegate của bạn, như fileOutlineView
)
- tạo ra 3 cột trong Outline với các số phân định sau (thiết lập chúng trong giao diện Builder):
NameColumn
, SizeColumn
, ModifiedColumn
Bây giờ, đối với phần còn lại, tôi sẽ làm tất cả lập trình, vì vậy mà bạn có ý tưởng hay về những gì đang diễn ra ...
Cách thiết lập (ví dụ: trong - (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];
Kết nối các dấu chấm:
/*******************************************************
*
* 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];
}
}
}
Gợi ý:ImageAndTextCell
lớp có thể được tìm thấy here. Bạn cũng sẽ nhận thấy một vài phương pháp khác mà tôi đang sử dụng, mà rõ ràng là không được hỗ trợ bởi Cocoa (ví dụ isFileHidden
, isFolder
hoặc folderContentsWithPathAndBackIgnoringHidden
) nhưng nó không phải là khó khăn để thực hiện chúng mình ...)
Nguồn
2012-04-23 06:39:42
Tôi không thấy làm thế nào điều này là chính xác. ImageAndTextCell thuộc loại NSCell, KHÔNG phải NSView. Câu hỏi đặt ra là về NSOutlineView dựa trên chế độ xem. Ví dụ của bạn chỉ là về việc tạo một lớp con NSCell tùy chỉnh mà chúng tôi đã có thể làm trong nhiều năm. Đối với NSTableView, có rất nhiều ví dụ về cách sử dụng NSView thay vì NSCell. Trông rất giống iOS. Tôi đã không tìm thấy bất kỳ ví dụ NSOutlineView đáng buồn. –
@ Các bảng dựa trên Adam-view sử dụng NSTableCellViews làm chế độ xem của chúng. Từ đó bạn có thể thêm bất kỳ nội dung nào cho họ. Điều mà Dr.Kameleon đã nói là chính xác. Toàn bộ các điểm dựa trên bảng là bạn có thể thêm bất kỳ đối tượng xem nào bạn muốn (Có thể là ô, nút, hình ảnh hay ... bất kỳ điều gì) – Patrick
Đây không phải là tạo chế độ xem phác thảo dựa trên chế độ xem. – JeremyP