Domanda

Ho un piccolo NSTableView con una casella di controllo. Ogni volta che la casella di controllo non è selezionata, voglio una delle NSCells adiacenti per essere in grigio e inaccessibile.

Tuttavia, non riesco a capire come affrontare una sola cella specifica. -dataCellForRow di NSTableColumn cambia sempre la cellula modello per la colonna della tabella intera.

Come posso accedere ad una singola cellula?

Modifica:. riempio la vista tabella utilizzando il protocollo NSTableViewDataSource

È stato utile?

Soluzione

Non "accedere ad una cella". NSTableView richiede i dati solo quando è necessario, non si popola o controllare direttamente.

Al contrario, si crea un oggetto di controllo che implementa il NSTableViewDatasource e protocolli opzionalmente NSTableViewDelegate. La vista tabella quindi invia i messaggi DataSource per il controller e le forniture del controller i dati appropriati.

È possibile consentire la modifica di un oggetto visualizzato nella vista tabella implementando il metodo ‑tableView:setObjectValue:forTableColumn:row: origine dati. Questo metodo sarà chiamato sul vostro oggetto controller quando l'utente fa clic sulla casella di controllo. È responsabilità del controller per aggiornare il modello in modo appropriato.

Quando il modello viene aggiornato, il controller dovrebbe dire la vista tabella per ricaricare. La vista tabella vi chiederà il controller per il valore di una cella che richiede display utilizzando il metodo ‑tableView:objectValueForTableColumn:row: origine dati. Ciò includerà la cella che è necessario disabilitare. Le vostre esigenze del controller di fornire il valore appropriato per la cella.

Se avete bisogno di un maggiore controllo della cella, è possibile implementare la metodo delegato ‑tableView:willDisplayCell:forTableColumn:row:. Questo è chiamato poco prima della visualizzazione di una cella, ed è possibile modificare il cellulare in modo appropriato.

Più informazioni sull'utilizzo di fonti di dati è in la documentazione .

L'altra opzione (invece di utilizzare un DataSource) è quello di utilizzare cacao Associazioni e un NSArrayController che si legano alla vostra collezione di oggetti del modello. In tal caso, è possibile associare il legame della colonna della tabella di alcune proprietà del vostro oggetto modello che controlla la cella di stato di abilitazione Enabled. E 'vostra responsabilità di garantire che lo stato di tale proprietà è corretta.

Se avete bisogno di fare la proprietà dipendente dal valore di un'altra proprietà, è possibile utilizzare il meccanismo chiave dipendente indicato nel Valore-chiave Observing documentazione.

Altri suggerimenti

Potresti legano la modificabilità della colonna per il valore che viene visualizzato nella casella di controllo? vale a dire se è selezionata, è modificabile, altrimenti non è?

Sto cercando di ricordare l'interfaccia esatta editore, e io non sono vicino al mio Mac a casa, quindi non sono in grado di fare una passeggiata totale attraverso su di esso -. Spero che questo può puntare nella giusta direzione

Dal SDK versione 10.7, c'è -viewAtColumn:row:makeIfNecessary: su NSTableView. La maggior parte delle informazioni che ho trovato sul web non prendere i nuovi metodi in considerazione, ecco che è per tutti gli altri alla ricerca di una risposta a questa domanda.

Dal mouse eventi per cellulare Selezione

In primo luogo, aggiungere un protocollo per il controller alla selezione delle cellule manico da una vista della tabella, in questo modo:

@protocol XYZCellSelectionDelegate <NSObject>
- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column;
@end

Poi NSTableView sottoclasse e di override -mouseDown:

// In your Custom Table View subclass:
- (void)mouseDown:(NSEvent *)event
{
    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
    NSInteger selectedRowIndex = [self rowAtPoint:point];
    NSInteger selectedColumnIndex = [self columnAtPoint:point];

    if ([self.calendarViewDelegate respondsToSelector:@selector(cellViewWasSelectedAtRow:column:)])
    {
        [self.calendarViewDelegate cellViewWasSelectedAtRow:selectedRowIndex column:selectedColumnIndex];
    }

    [super mouseDown:event];
}

In seguito, è possibile utilizzare -viewAtColumn:row:makeIfNecessary: come questo in oggetto delegato / regolatore:

- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column
{
    NSView *selectedView = [self.tableView viewAtColumn:column row:row makeIfNecessary:YES];

    // Do something with the cell to the right
    NSInteger nextColumn = column + 1;
    NSView *cellNextToIt = [self.calendarTableView viewAtColumn:nextColumn row:row makeIfNecessary:YES];

}

Nota. Al giorno d'oggi, mi piacerebbe passare la visualizzazione della tabella al delegato come parametro invece di affidarsi a delegato per mantenere un riferimento alla visualizzazione della tabella

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top