2012-11-11 9 views
5

Ich bin neu in Kakao und ich bin frustriert, ich habe fast den halben Tag damit verbracht herauszufinden, wie man ein NSView zu einer NSTableView Zelle hinzufügen, aber ich habe kein gefunden schöne Anleitung, die mir helfen kann tun, was ich möchte, erreichen, vielleicht kann jemand einen Blick auf das, was ich habe versucht, und sagen sie mir, warum es nicht funktioniert und wie ich konnte es die Arbeit an ...Cocoa NSView in NSTableView Zelle

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{ 
NSTableCellView *view = [tableView makeViewWithIdentifier:@"MyView" owner:self]; 
NSTextField *textfield = [[NSTextField alloc]initWithFrame:NSMakeRect(0, 0, 100, 30)]; 
[textfield setStringValue:predictate_search[row]]; 
[textfield setBackgroundColor:[NSColor redColor]]; 
[view addSubview:textfield]; 
[view setNeedsDisplay:YES]; 
return view; 
} 

Was ich erreichen möchte, ist, zwei NSTextFields übereinander zu haben und die Tabellenzelle einen benutzerdefinierten Hintergrund zu haben. Das obige wird mich versuchen, nur um ein NSTextField zu arbeiten, aber ohne Glück ...

Die NSTableView wird programmatisch erstellt:

NSScrollView *scrollView = [[NSScrollView alloc]initWithFrame:bg]; 
    [scrollView setHasVerticalScroller:YES]; 
    [self addSubview:scrollView]; 

    search_results = [[NSTableView alloc]initWithFrame:bg]; 
    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"id"]; 
    [[column headerCell] setStringValue:@"Cities"]; 
    [column setWidth:1000.0]; 

    [search_results addTableColumn:column]; 
    [search_results setDelegate:(id)self]; 
    [search_results setDataSource:(id)self]; 
    [search_results reloadData]; 

    [scrollView setDocumentView:search_results]; 

Ich bin etwas verwirrt, was für die makeViewWithIdentifier: zu setzen, Ich habe das WWDC 2011 Video auf NSTableViews gesehen, aber ich bin mir immer noch nicht wirklich sicher.

Wenn Sie weitere Informationen wünschen, wenden Sie sich bitte

Dank

EDIT Nach dem ersten Antwort:

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{ 
NSTableCellView *view = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:self]; 
if(view == nil){ 
    NSTableCellView *view = [[NSTableCellView alloc]initWithFrame:[tableView frame]]; 
    view.identifier = [tableColumn identifier]; 
} 
NSTextField *textfield = [[NSTextField alloc]initWithFrame:NSMakeRect(0, 0, 100, 30)]; 
[textfield setStringValue:predictate_search[row]]; 
[textfield setBackgroundColor:[NSColor redColor]]; 
[view addSubview:textfield]; 
[view setNeedsDisplay:YES]; 
return view; 

}

aber es funktioniert immer noch nicht?

Antwort

1

Ihre Methode, die die Zelle zurückkehrt muss die Zelle machen, wenn es dequeable ist nicht (weil es keine gibt)

// There is no existing cell to reuse so we will create a new one 
if (result == nil) { 

    // create the new NSTextField with a frame of the {0,0} with the width of the table 
    // note that the height of the frame is not really relevant, the row-height will modify the height 
    // the new text field is then returned as an autoreleased object 
    result = [[[NSTextField alloc] initWithFrame:...] autorelease]; 

    // the identifier of the NSTextField instance is set to MyView. This 
    // allows it to be re-used 
    result.identifier = @"MyView"; 
    } 
+0

Ich habe das hinzugefügt, aber es funktioniert immer noch nicht ... –

+0

nur Überprüfung ... Sie haben die anderen Methoden implementiert? :: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Protocols/NSTableDataSource_Protocol/Reference/Reference.html –

+0

Ich habe die '- (NSInteger) numberOfRowsInTableView implementiert: (NSTableView *) aTableView' soweit ich weiß ist es das einzige zwingend ... –

6

Der folgende Code mein Problem gelöst:

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{ 
NSView *view = [tableView makeViewWithIdentifier:@"MyView" owner:self]; 

if (view == nil) { 
    view = [[NSView alloc]initWithFrame:NSMakeRect(0, 0, 100, 30)]; 
    NSTextField *result = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 25, 800, 25)]; 
    NSTextField *result2 = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 800, 25)]; 
    result.stringValue = [predictate_search objectAtIndex:row]; 
    result2.stringValue = @"UnitedKingdom"; 
    [view addSubview:result]; 
    [view addSubview:result2]; 
    [view setNeedsDisplay:YES]; 
} 

return view; 

} 

Danke für die Hilfe :)

0

Nun, wenn ich mir das anschaue, füge ich eine Antwort hinzu, für den Fall, dass jemand in der Zukunft darüber stolpert.

Ansicht ist in der zweiten Zeile des Codeausschnitts definiert. Wenn es null ist, fällt es in die if-Anweisung und die Sicht wird erneut definiert. Die Ansicht, die aus der in-Anweisung herauskommt, verschwindet, weil sie innerhalb des Bereichs der Klammer definiert wurde, und stirbt, wenn das Programm diesen Bereich verlässt, so dass Sie das ursprüngliche nil erhalten.

Jetzt kann es noch viele weitere Probleme geben, aber das ragt heraus. Ich habe etwas zu diesem Thema recherchiert, diese Frage gefunden und das Scoping-Problem bemerkt.