NSButton viene disegnato all'interno di Nscell personalizzato, ma in realtà non è cliccabile
-
13-11-2019 - |
Domanda
Ho un nstableview che contiene la mia sottoclasse Nscell personalizzata, Iconcell.
L'iconcell contiene tre elementi: un'immagine, un testo e un pulsante.
Ecco una versione semplificata del mio codice di disegno (closeButton
è il pulsante):
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
NSPoint cellPoint = cellFrame.origin;
[controlView lockFocus];
CGFloat buttonWidth = [closeButton frame].size.width;
[someNSImage drawInRect:NSMakeRect(cellPoint.x, cellPoint.y, ICON_WIDTH, ICON_HEIGHT) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
[someNSString drawInRect:NSMakeRect(cellPoint.x+ICON_WIDTH+PADDING, cellPoint.y, cellFrame.size.width - ICON_WIDTH - buttonWidth, cellFrame.size.height) withAttributes:someTextAttributes];
[(NSButtonCell*)[closeButton cell] drawWithFrame:NSMakeRect(cellPoint.x + cellFrame.size.width - buttonWidth, cellPoint.y, buttonWidth, cellFrame.size.height) inView:controlView];
[controlView unlockFocus];
}
La parte del disegno funziona bene e produce qualcosa di simile:
che è quello che voglio.
Inoltre, voglio che una delle due cose accada quando l'utente interagisce con la cella: se l'utente fa clic sulla cella, tranne il pulsante di chiusura, dovrebbe fare actionA
. Se l'utente fa clic sul pulsante Chiudi, dovrebbe farlo actionB
.
Il problema che sto riscontrando è che il pulsante di chiusura sembra "invisibile" - se faccio clic su di esso, non si muove (mentre un pulsante di lavoro dovrebbe mostrare il suo stato spinto verso il basso), e in generale si comporta come se non lo fosse lì, e actionA
viene attivato invece di actionB
.
Ecco come ho impostato le due azioni:
[tableView setAction:@selector(actionA)];
e
[closeButton setAction:@selector(actionB)];
Che cosa sto facendo di sbagliato?
Soluzione
Stai solo disegnando un'immagine del pulsante nella cella. Questa non è la stessa cosa del posizionare il pulsante reale nella cella.
Le celle non sono viste complete, quindi questo è più complicato di quanto si possa pensare all'inizio. Se devi davvero farlo con le cellule, è spiegato qui: NSButtonCell all'interno di Nescell personalizzato.
Ma ... se riesci a limitarti a 10.7+, hanno aggiunto viste di tabelle basate sulla vista. Questi sono molto più semplici, dal momento che puoi mettere un pieno NSButton
dentro il tuo NSTableViewCellView
. Questo è spiegato nel Guida alla programmazione della visualizzazione della tabella. Altamente raccomandato se puoi limitarti a 10.7+.