Sto cercando una soluzione semplice per eliminare le righe di NSTableView premendo il tasto Canc. Tutto quello che ho visto durante la ricerca su Google sono state risposte come questa: http://likethought.com/lockfocus/2008/04/a-slightly-improved-nstableview/. Questa mi sembra una soluzione di ingegneria, ma mi piacerebbe sapere se questo è il modo migliore. Qualcuno sa una risposta migliore?NSTableView + Elimina chiave
risposta
Ho implementato qualcosa di simile a LTKeyPressTableView
. Tuttavia, io uso i controller di array, quindi nella mia sottoclasse ho aggiunto IBOutlet NSArrayController * relatedArrayController
. Invece di gestire la richiesta di eliminazione in un delegato, la gestisco direttamente nella sottoclasse poiché la mia sottoclasse si occupa specificamente dell'aggiunta della gestione della chiave Delete. Quando rilevo tasti per la chiave di cancellazione, sto chiamando lo [relatedArrayController delete:nil];
.
IRTableView.h:
#import <Cocoa/Cocoa.h>
@interface IRTableView : NSTableView {
IBOutlet NSArrayController * relatedArrayController;
}
@end
e IRTableView.m:
#import "IRTableView.h"
@implementation IRTableView
- (void)keyDown:(NSEvent *)event
{
// Based on LTKeyPressTableView.
//https://github.com/jacobx/thoughtkit/blob/master/LTKeyPressTableView
id delegate = [self delegate];
// (removed unused LTKeyPressTableView code)
unichar key = [[event charactersIgnoringModifiers] characterAtIndex:0];
if(key == NSDeleteCharacter)
{
if([self selectedRow] == -1)
{
NSBeep();
}
BOOL isEditing = ([[self.window firstResponder] isKindOfClass:[NSText class]] &&
[[[self.window firstResponder] delegate] isKindOfClass:[IRTableView class]]);
if (!isEditing)
{
[relatedArrayController remove:nil];
return;
}
}
// still here?
[super keyDown:event];
}
@end
risultato finale è abbastanza IB-friendly per me, e un bel soluzione semplice da utilizzare in un cacao Attacchi + Nucleo Applicazione dati
Quello che faccio di solito è creare una nuova voce di menu nella barra dei menu dell'applicazione. Qualcosa di simile:
File -> Delete ${Name of Item}
Quindi è possibile creare un collegamento che NSMenuItem
in Interface Builder per puntare a un metodo IBAction definita da qualche parte su entrambi il delegato applicazione o qualche altro controller. L'implementazione di questo metodo dovrebbe eliminare l'elemento dal modello e aggiornare lo NSTableView
.
Il vantaggio di fare un NSMenuItem
fuori dall'azione è che:
- si può dare la voce una scorciatoia da tastiera in Interface Builder. (Come la chiave di cancellazione.)
- Gli utenti che non hanno familiarità con la tua applicazione, hanno paura di premere il tasto Canc, o non hanno accesso a una tastiera per qualsiasi motivo, possono ancora fare uso di questa funzionalità.
Dopo 10.10, NSViewController fa parte della catena di risposta. Quindi il modo più semplice è implementare keyDown nel NSViewController sottoclassato
Buon punto sull'utilizzo della catena di risposta per evitare la sottoclasse (ove possibile). –
Non è necessario creare sottoclasse e catturare keyDown
in NSViewController
.
La voce di menu è collegata al selettore delete:
di First Responder. Se non è presente la voce di menu Delete
, crearne una e collegarla a delete:
di First Responder (cubo rosso).
- Assegnare un equivalente fino alla voce di menu
Delete
(⌫ o ⌘⌫) Nel regolatore vista implementare il metodo
IBAction
Swift:
@IBAction func delete(_ sender: AnyObject)
Objective- C:
-(IBAction)delete:(id)sender
e inserire la logica per eliminare le righe di visualizzazione tabella.
Ciao, Craig. La tua risposta non era quella che mi aspettavo, ma suona piuttosto bene! = D Grazie mille. – Leandro
Haha sì, all'inizio sembra un approccio piuttosto indiretto, ma funziona molto bene, e si prende cura di un sacco di mal di testa. –
a meno che non si abbiano due viste tabella ... – peetonn