11
votes

NSTableView + Supprimer la clé

Je recherche une solution facile pour supprimer NSTableView lignes en appuyant sur la touche DELETE.

Tout ce que j'ai vu lors de la recherche dans Google, des réponses comme ceci: http://likethough.com/Lockfocus/2008/04/a -Slight-améliorés-NSTableView /

Cela me semble une solution d'ingénierie, mais j'aimerais savoir si c'est le meilleur moyen. Est-ce que quelqu'un connaît une meilleure réponse?


0 commentaires

4 Réponses :


27
votes

Ce que je fais habituellement est de créer un nouvel élément de menu dans la barre de menus de votre application. Quelque chose comme:

Fichier -> Supprimer $ {Nom de l'élément}

Ensuite, vous pouvez lier que nsmenuitem dans l'interface Builder sur une méthode d'ibaction définie quelque part sur votre délégué de l'application ou un autre contrôleur. La mise en œuvre de cette méthode devrait supprimer l'élément de votre modèle et rafraîchir le NSTableView .

L'avantage de faire un nsmenuitem hors de l'action est que:

  1. Vous pouvez donner à l'élément un raccourci clavier dans l'interface Builder. (Comme la touche DELETE.)
  2. Les utilisateurs qui ne sont pas familiarisés avec votre application, ont peur d'appuyer sur la touche DELETE ou n'ont pas accès à un clavier pour une raison quelconque, peuvent toujours utiliser cette fonctionnalité.

4 commentaires

Salut, Craig. Votre réponse n'était pas ce que je m'attendais vraiment, mais ça sonne plutôt bien! = D Merci beaucoup.


Haha Yea, au début, il ressemble à une approche assez indirecte, mais cela fonctionne extrêmement bien et s'occupe de beaucoup de mal de tête.


@peeetonn Si vous avez deux vues de table, vous pouvez simplement vérifier lequel se concentre sur votre mise en œuvre de la méthode. Et vous pouvez également ajouter un auditeur de focus si vous souhaitez mettre à jour de manière dynamique l'élément de menu.


Est-ce une action «globale» ou est-elle automatiquement appliquée directement au contrôle de la commande?



12
votes

J'ai implémenté quelque chose de similaire à ltkeypressTableView code>. Cependant, j'utilise des contrôleurs de tableau, donc dans ma sous-classe, j'ai ajouté iboutlet nsarraycontroller * likeachraycontroller code>. Au lieu de manipuler la demande de suppression de la demande dans un délégué, je le gère directement dans la sous-classe, car ma sous-classe traite spécifiquement d'ajouter une manipulation de la clé Suppr. Lorsque je détecte KeyPress pour Supprimer la clé, j'appelle simplement [liaparrayController Supprimer: nil]; code>. > IRTAbleview.h: p>

#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


0 commentaires

10
votes

Après 10.10, NsviewController fait partie de la chaîne du répondeur. Donc, le moyen le plus simple est de mettre en œuvre la clé de votre sous-classement NsviewController


1 commentaires

Bon point sur l'utilisation de la chaîne du répondeur pour éviter le sous-classement (dans la mesure du possible).



11
votes

Il n'y a pas besoin de sous-classement et d'attraper clé dans nsviewcontroller .

L'élément de menu Supprimer dans le menu Modifier est connecté au sélecteur Supprimer: du premier répondeur. S'il n'y a pas d'élément de menu Supprimer , créez-en un et connectez-le à Supprimer: du premier répondeur (cube rouge).

  • Attribuez une clé équivalente à l'élément de menu Supprimer ( ou ⌘⌫ )
  • dans le contrôleur d'affichage Implémentez la méthode ibaction

    Swift: @ibaction Func Suppr Suppr (_ Sender: AnyObject)

    Objective-C: - (ibaction) Supprimer: (ID) Sender

    et mettre dans la logique pour supprimer la vision de la table.


12 commentaires

@isavadevru S'il vous plaît écrivez en anglais.


S'il vous plaît écrivez en russe :) Qui a besoin, il comprendra. Je me sens mal à l'aise en lisant l'anglais. Mais j'ai lu et traduis, mais c'est difficile pour vous? :)


Vadian, Ваш пример Годится отчасти. Некая путаница с логикой будет, лишняя нагрузка. Подкласс будет отвечать только за свой объект. Лишних забот не нужно делать.


Je traduit en anglais. Vadian, votre exemple est en partie approprié. Il y aura une certaine confusion avec la logique, une charge supplémentaire. Une sous-classe sera responsable que pour son objet. Aucune inquiétude supplémentaire doit être faite.


La langue communautaire de Stackoverflow est l'anglais, mais il y a aussi un forum russe


Je connais. Alors, qu'est-ce que la prochaine est? Les questions ici et il y a différents. Néanmoins, je me suis inscrit ici quand il n'y avait pas de forum russe. Cela ne change rien. Les gens parlent la langue dans laquelle il convient.


Cela ne vaut pas la peine de discuter de cela. Qui a besoin de ça, il comprendra. Ne pas, passez par.


Je suis ici 7 ans, vous avez 3 ans. Prendre note.


Mais bien sûr, votre réponse a le droit d'être dans des applications simples ou pour AppleScriptobjc. Je mets un plus.


Merci @vadian, il s'agit d'une méthode élégante.


Est-ce une action «globale» ou est-elle automatiquement appliquée directement au contrôle de la commande?


C'est un moyen de le faire - une "solution d'entrée"; Créez Alternate éléments de menu - mais assurez-vous de ne pas marquer comme tel dans IB - ils sont distincts!, pour les touches et faire Ils cachés et autorisés quand cachés . Beaucoup mieux que la "solution de sortie" - Touches de décodage.