[TRUKéASTUCE] Simuler une désactivation (setEnabled:NO) sur une NSTableView

BruBru Membre
mai 2005 modifié dans Objective-C, Swift, C, C++ #1
Voici un truc qui permet de rendre l'aspect d'une NSTableView désactivée. La technique porte sur la création d'une customView qui "grise" la NSTableView en se superposant dessus.

La première étape est l'implémentation de la classe customView, nommée ici DisabledTableView :

fichier DisabledTableView.h :
<br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface DisabledTableView : NSControl<br />{<br />    BOOL _hsve;<br />    BOOL _vsve;<br />    NSScrollView *_sv;<br />}<br />- (id)initWithScrollView:(NSScrollView *)scrollView;<br />@end<br />


et le fichier DisabledTableView.m :
<br />#import &quot;DisabledTableView.h&quot;<br /><br />@implementation DisabledTableView<br />- (id)initWithScrollView:(NSScrollView *)scrollView<br />{<br />    if ([self initWithFrame:[scrollView frame]])<br />    {<br />        _sv=scrollView;<br />        if ([scrollView hasHorizontalScroller])<br />        {<br />            _hsve=[[scrollView horizontalScroller] isEnabled];<br />            [[_sv horizontalScroller] setEnabled:NO];<br />        }<br />        if ([scrollView hasVerticalScroller])<br />        {<br />            _vsve=[[scrollView verticalScroller] isEnabled];<br />            [[_sv verticalScroller] setEnabled:NO];<br />        }<br />        [self setAutoresizingMask:[scrollView autoresizingMask]];<br />    }<br />    return self;<br />}<br /><br />- (BOOL)isOpaque<br />{<br />    return NO;<br />}<br /><br />- (void)drawRect:(NSRect)rect<br />{<br />    [[NSColor colorWithDeviceWhite:1.0 alpha:0.7] set];<br />    [NSBezierPath fillRect:[self bounds]];<br />}<br /><br />- (void)dealloc<br />{<br />    if ([_sv hasHorizontalScroller]) [[_sv horizontalScroller] setEnabled:_hsve];<br />    if ([_sv hasVerticalScroller]) [[_sv verticalScroller] setEnabled:_vsve];<br />    [super dealloc];<br />}<br />@end<br />


.

Réponses

  • BruBru Membre
    18:00 modifié #2
    Enfin, ne reste plus qu'à  utiliser cette customView DisabledTableView pour activer/désactiver une NSTableView.

    Ceci ce fait par un simple appel à  une procédure C, qui appellée depuis le contrôleur "contrôlant" la tableView, fait apparaà®tre/disparaà®tre la DisabledTableView en fonction de l'état enabled de la tableView.

    procédure C :
    <br />void EnableTableView(NSTableView *tableView)<br />{<br />    NSView *parentView;<br />    NSScrollView *scrollView;<br />    DisabledTableView *disTableView;<br /><br />    scrollView=(NSScrollView *)[[tableView superview] superview];<br />    parentView=[scrollView superview];<br /><br />    if ([tableView isEnabled])<br />    {<br />        // la tableView est disabled : on supprime la DisabledTableView.<br />        [[parentView viewWithTag:(int)scrollView] removeFromSuperview];<br />    }<br />    else<br />    {<br />        // la tableView est &quot;enabled&quot; : on affiche une DisabledTableView.<br />        disTableView=[[DisabledTableView alloc] initWithScrollView:scrollView];<br />        [disTableView setTag:(int)scrollView];<br />        [parentView addSubview:disTableView];<br />        [disTableView release];<br />    }<br />    [parentView setNeedsDisplay:YES];<br />}<br />
    


    Voici un exemple d'utilisation :
    <br />// désactivation de la tableView &#39;tb&#39;<br />[tb setEnabled:NO];<br />EnableTableView(tb);<br /><br />// ré-activation de la tableView &#39;tb&#39;<br />[tb setEnabled:YES];<br />EnableTableView(tb);<br />
    


    .
Connectez-vous ou Inscrivez-vous pour répondre.