2012-11-11 15 views
5

Sono nuovo al cacao e mi sento frustrato, ho passato quasi la metà del giorno a cercare di scoprire come aggiungere una NSView a una cella NSTableView, ma non ho trovato un bella guida che può aiutarmi a fare quello che vorrei realizzare, forse qualcuno può dare un'occhiata a quello che ho provato e mi dica il motivo per cui non funziona e come ho potuto farlo funzionare ...Cocoa NSView nella cella NSTableView

-(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; 
} 

Quello che mi piacerebbe ottenere è avere due NSTextField uno sopra l'altro e la cella della tabella per avere uno sfondo personalizzato. Quanto sopra mi sta solo cercando di ottenere uno NSTextField a lavorare, ma senza fortuna ...

Il NSTableView si crea a livello di codice:

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]; 

Sono un po 'confuso cosa mettere per la makeViewWithIdentifier:, Ho visto il video WWDC 2011 su NSTableViews ma non ne sono ancora sicuro.

Se avete bisogno di ulteriori informazioni si prega di chiedere

Grazie

EDIT Dopo la prima risposta:

-(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; 

}

Tuttavia ancora non funziona?

risposta

1

il metodo che restituisce la cella deve fare la cella se si mangia dequeable (perché nessuno è lì)

// 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

L'ho aggiunto, ma non funziona ancora ... –

+0

solo controllando ... hai implementato gli altri metodi? :: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Protocols/NSTableDataSource_Protocol/Reference/Reference.html –

+0

Ho implementato il '- (NSInteger) numberOfRowsInTableView: (NSTableView *) aTableView' per quanto ne so è l'unico obbligatorio ... –

6

Il codice sotto risolto il mio problema:

-(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; 

} 

Grazie per l'aiuto :)

0

Beh, guardando questo, ho intenzione di aggiungere una risposta nel caso in cui qualcuno inciampi su questo in futuro.

la vista è definita nella seconda riga del frammento di codice. Se è nullo, cade nell'istruzione if e la vista viene nuovamente definita. La vista che emerge dall'istruzione in scompare perché è stata definita nell'ambito della parentesi e muore quando il programma lascia quell'ambito lasciandoti il ​​nil originale.

Ora ci possono essere molti più problemi con questo, ma che sporge. Stavo facendo qualche ricerca sull'argomento e ho trovato questa domanda e ho notato il problema dell'ambito.

Problemi correlati