Question

J'ai un NSTableView qui contient ma sous-classe NSCell personnalisée, IconCell.

L'IconCell contient trois éléments :une image, du texte et un bouton.

Voici une version simplifiée de mon code de dessin (closeButton est le bouton):

- (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 partie dessin fonctionne bien et produit quelque chose comme ce qui suit :

cell screenshot

c'est ce que je veux.

De plus, je souhaite que l'une des deux choses suivantes se produise lorsque l'utilisateur interagit avec la cellule :si l'utilisateur clique n'importe où sur la cellule, SAUF sur le bouton de fermeture, cela devrait faire l'affaire actionA.Si l'utilisateur clique sur le bouton de fermeture, cela devrait faire actionB.

Le problème que j'ai est que le bouton de fermeture semble "invisible" -- si je clique dessus, il ne bouge pas (alors qu'un bouton qui fonctionne devrait montrer son état enfoncé), et en général il se comporte comme s'il l'était. je n'y suis pas, et actionA est déclenché au lieu de actionB.

Voici comment j'ai défini les deux actions :

[tableView setAction:@selector(actionA)];

et

[closeButton setAction:@selector(actionB)];

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Vous dessinez simplement une image du bouton dans la cellule.Ce n'est pas la même chose que de placer le bouton lui-même dans la cellule.

Les cellules ne sont pas des vues complètes, c'est donc plus compliqué que vous ne le pensez au début.Si vous devez vraiment faire cela avec des cellules, c'est expliqué ici : NSButtonCell dans NSCell personnalisé.

Mais...si vous pouvez vous limiter à 10,7+, ils ont ajouté des tables vues basées sur les vues.C'est beaucoup plus simple, puisque vous pouvez mettre un NSButton à l'intérieur de votre NSTableViewCellView.Ceci est expliqué dans le Guide de programmation de la vue tableau.Fortement recommandé si vous pouvez vous limiter à 10,7+.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top