2011-01-12 18 views

risposta

12

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

26

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:

  1. si può dare la voce una scorciatoia da tastiera in Interface Builder. (Come la chiave di cancellazione.)
  2. 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à.
+1

Ciao, Craig. La tua risposta non era quella che mi aspettavo, ma suona piuttosto bene! = D Grazie mille. – Leandro

+2

Haha sì, all'inizio sembra un approccio piuttosto indiretto, ma funziona molto bene, e si prende cura di un sacco di mal di testa. –

+0

a meno che non si abbiano due viste tabella ... – peetonn

9

Dopo 10.10, NSViewController fa parte della catena di risposta. Quindi il modo più semplice è implementare keyDown nel NSViewController sottoclassato

+1

Buon punto sull'utilizzo della catena di risposta per evitare la sottoclasse (ove possibile). –

4

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.

Problemi correlati