2011-02-09 2 views

risposta

2

Si potrebbe creare una sottoclasse di NSTableView, ignorando keyDown in questo modo:

- (void)keyDown:(NSEvent *)theEvent 
{ 

    unichar key = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]; 
    if(key == NSDeleteCharacter) 
    { 

     [self deleteItem]; 
     return; 
    } 

    [super keyDown:theEvent]; 

} 

quindi assicurarsi che qualsiasi NSTableView che si desidera avere la funzionalità di eliminazione utilizza la sottoclasse in Interface Builder invece del normale NSTableView.

è possibile implementare il metodo - (void)deleteItem per esempio come questo:

- (void)deleteItem 
{ 
    if ([self numberOfSelectedRows] == 0) return; 

    NSUInteger index = [self selectedRow]; 

    [documentController deleteItemWithIndex:index]; 

} 
+0

Se si dispone di diverse visualizzazioni che è necessario tenere traccia separatamente dallo stesso documentController, è possibile identificarle utilizzando i tag , cioè inserisci un tag per la vista in Interface Builder, quindi controlla il valore del valore self.tag nel metodo 'keyDown:'. – Frost

+2

Ci dispiace, ma questa risposta non dovrebbe essere contrassegnata corretta. Questa soluzione non è assolutamente la migliore pratica. – Jacque

7

Un approccio che è facile da implementare:

  1. pulsanti aggiuntivi +/- per l'interfaccia in IB e collegarli ad un deleteRecord IBAction
  2. con la cancellazione (-) pulsante selezionato in IB, navigare Attributi ispettore> Pulsante> chiave equivalente
  3. clic nella casella per iniziare a registrare la vostra pressione di un tasto, poi ha colpito il Canc/Backspace chiave

Quando si genera il progetto, dato che yo u implementare il metodo deleteRecord, pressione di un tasto Backspace cancellerà record dal Tableview

+1

Sì, l'ho capito, ma mi dà problemi quando ho più di 1 vista tabella alla volta :) –

6

Il modo corretto di attuare questa funzionalità è quello di utilizzare associazioni di tasti:

  1. Selezionare la voce di menu di eliminazione in IB e Ad esempio, imposta la chiave equivalente al tasto backspace.
  2. Connetti l'azione delle voci di menu a un metodo che hai scritto per la gestione dell'attività. Questo metodo verrà trovato automaticamente nella catena di risposta, quando lo colleghi tramite il primo risponditore.
  3. Implementa la funzionalità di eliminazione.

A seconda del tipo di applicazione che si scrive, esistono metodi di delegazione di convalida. In questo modo è possibile impostare lo stato abilitato per le voci di menu. Per un'applicazione basata su documenti questa convalida avviene tramite - (BOOL)validateUserInterfaceItem:(id)anItem.

3

Questa è una soluzione moderna che utilizza NSViewController e First Responder.

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.

Nessuna sottoclasse necessaria.

+0

Da dove viene l'azione di eliminazione? Posso vedere un sacco di azioni come questa in IB, ma NSResponder non le definisce tutte. – KoCMoHaBTa

+0

@ IBAction o @ objc danno lo stesso risultato. Manca questo rende Elimina la voce del menu per essere greye fuori – azimov