2009-08-24 2 views
4

NSOutlineViewの編集可能なセルを作成する方法を知っている人はいますか?私はリンゴからsampeコードを使用して、私はそれはまったく動作するように思わない。NSOutlineViewの行を編集可能にする

NSOutlineViewのセルで2回連続して2回クリックすると、セルが編集可能になり、ユーザーがセル内のテキストを更新できるように設定しようとしています。 (xcodeやメールなどと同じように)。

私は間違ってやっていることに気付くことができる無駄のないこのコントローラの残りのコードのほとんどを含めています。これは非常にイライラです。ダブルクリックするとNSLogメッセージを返すので、shouldEditTableColumnが呼び出されています。

@implementation DisplayHierarchyController 
- (void)awakeFromNib { 
    // cache the reused icon images 
    folderImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)] retain]; 
    [folderImage setSize:NSMakeSize(16,16)]; 
    objectImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericPreferencesIcon)] retain]; 
    [objectImage setSize:NSMakeSize(16,16)]; 
    diagramImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericEditionFileIcon)] retain]; 
    [diagramImage setSize:NSMakeSize(16,16)]; 
    // 
    // Tell the outline view to use a special type of cell 
    //NSTableColumn *tableColumn = [[outline tableColumns] objectAtIndex: 0]; 
    //ImageTextCell *imageTextCell = [[[ImageTextCell alloc] init] autorelease]; 
    //[imageTextCell setEditable:YES]; 
    //[tableColumn setDataCell:imageTextCell]; 
    // 
    [[[outline tableColumns] objectAtIndex: 0] setEditable: YES]; 
} 
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    NSLog(@"edit %@", tableColumn); 
    return YES; 
} 
- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    ImageTextCell *imageTextCell = [[[ImageTextCell alloc] init] autorelease]; 
    [imageTextCell setEditable:YES]; 
    return imageTextCell; 
} 
// Returns the object that will be displayed in the tree 
- (id)outlineView: (NSOutlineView *)outlineView child: (int)index ofItem: (id)item { 
    if(item == nil) 
     return [[document children] objectAtIndex: index]; 
    if([item isKindOfClass: [Item class]]) 
     return [[item children] objectAtIndex: index]; 
    return document; 
} 
- (BOOL)outlineView: (NSOutlineView *)outlineView isItemExpandable: (id)item { 
if([item isKindOfClass: [Item class]]) 
    return [[item children] count]>0; 
return NO; 
} 
- (int)outlineView: (NSOutlineView *)outlineView numberOfChildrenOfItem: (id)item { 
    if(item == nil) 
     return document.children.count; 
    if([item isKindOfClass: [Item class]]) 
     return [[item children] count]; 
    return 0; 
} 
- (id)outlineView: (NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    if([item isKindOfClass: [Item class]]) 
     return [item name]; 
    return @"n/a"; 
} 
- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    NSLog(@"setObjectValue called"); 
} 
- (void)outlineView:(NSOutlineView *)olv willDisplayCell:(NSCell*)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    [cell setEditable: YES]; 
    [cell setAllowsEditingTextAttributes: YES]; 
    [(ImageTextCell*)cell setImage: objectImage]; 
} 
- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor { 
    return YES; 
} 
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor { 
    if ([[fieldEditor string] length] == 0) { 
     // don't allow empty node names 
     return NO; 
    } else { 
     return YES; 
    } 
} 
@end 
+1

「まったく動作しないようです。」これはどういう意味ですか?より具体的に質問を編集してください。 –

+0

うまくいけばそれはそれをより明確にします。私はその行の編集を有効にするために行をダブルクリックしたい – Jacob

+2

これを動作させる方法をさらに研究しています。アップルのドキュメントでは、「アウトラインビューは親クラスNSTableViewからの動作の多くを継承しています。詳細は、「Table Viewプログラミングガイド」を参照してください。 NSTableViewはこのメソッドを持っています "(BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn行:(NSInteger)rowIndex"しかし、私はそれが私のコントローラにそれが取得する方法で追加することはできないようですと呼ばれる。 – Jacob

答えて

3

私はちょうど私がshouldEditTableColumnを変更することによってそれを "偽造"できることを発見しました。それは本当に理想的ではありませんが、機能します。何時間も働いた後、少なくともこれは何かです:

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    NSLog(@"edit %@", tableColumn); 
    [outline editColumn:0 row:[outline selectedRow] withEvent:[NSApp currentEvent] select:YES]; 
    return YES; 
} 
+0

これは技術的に正しい答えではありませんが、動作するためには私が見つけることができる最も近いものです。それはまったくうまくいくわけではありませんが、確かにそれ以上のものはありません! – Jacob

6

列自体が編集可能に設定されていますか?通常、IBでこれを行います。

さらに、データソースにthe outlineView:setObjectValue: methodを実装しましたか?

+1

インターフェイスビルダでセルをクリックすると編集可能に設定されますが、画像があるカスタムセルでセルをオーバーライドしていますが、関連するかどうかわかりません。 私はまた何をすべきかもわかりませんsetObjectValueで(そのドキュメントから明らかではない):( – Jacob

+3

私はセルを言っていませんでした、私はコラムを言った。それは独自の編集可能なチェックボックスを持っています。'setObjectValue:'に関して:これは、ユーザーが行った変更を受け取り、モデルに適用する場所です。これは 'objectValue:'と逆の方向で、モデルを調べてその情報をアウトラインビューに提供してユーザーに表示します。 –

+1

Doh、申し訳ありませんが、私はあなたが書いたことを誤解しました。 NSTableColumnは編集可能なようにチェックされています(デフォルトであると思われます) – Jacob

1

私はこれを回避する方法を見つけました。 IBの列のデータセルを設定します(awakeFromNibでプログラム的にも動作するはずです)。私は実際に2つの異なるカスタムセルクラスを使用します。私の解決策:

NSCell *cell = [tableColumn dataCellForRow: [outlineView rowForItem: item]]; 

if ([item isKindOfClass: [NSString class]]) 
    return [[[ShadowTextCell alloc] initTextCell: [cell stringValue]] autorelease]; 
return cell; 
8

私は、これは非常に古いポストですけど、いずれかが同じ問題が発生している場合、これはコードに関連した問題ではないかもしれません。私の場合は、XIB自体に設定された値と関係する問題でした。

AppleのコードをすべてコピーしてNSOutlineViewを起動していて、まだ編集できないものがある場合は、XIBに行き、セルのNSTextFieldの次の設定を設定しますあなたは編集可能になりたい。私の場合、動作設定はなしにデフォルトで設定されていました。たぶん、その同じ問題あなた

enter image description here

乾杯用。

+0

ありがとう!これも私がやっていた問題でした。私は自分のコードに「バグ」を修正することに重点を置いていたので、IBをチェックするとは思わなかった。 – sapi

+0

shouldEditTableColumnが呼び出されないビューベースのアウトラインビューでは、これはXcode8とSwift 3の場合でも同じです。良いキャッチ。 –

関連する問題