Objective c 仅在按住按钮时激活代码

Objective c 仅在按住按钮时激活代码,objective-c,xcode,macos,interface-builder,ibaction,Objective C,Xcode,Macos,Interface Builder,Ibaction,我试图只在按下(并按住)按钮时激活代码的一部分。松开按钮后,我希望我的标签再次不可见。有没有办法有效地做到这一点?我有一个iAction(按钮)和一个iOutlet(文本字段),为该操作设置了以下代码: - (IBAction)toggleIt:(id)sender { if ([myDescription isHidden]) { [myDescription setHidden:NO]; } else { [myDescription setH

我试图只在按下(并按住)按钮时激活代码的一部分。松开按钮后,我希望我的标签再次不可见。有没有办法有效地做到这一点?我有一个iAction(按钮)和一个iOutlet(文本字段),为该操作设置了以下代码:

- (IBAction)toggleIt:(id)sender {
    if ([myDescription isHidden]) {
        [myDescription setHidden:NO];
    } else {
        [myDescription setHidden:YES];
    }
}
有什么帮助吗?(用傻瓜的话说)


Zach

您可以使用
UIControlEventTouchDown
隐藏标签,然后在
UIControlEventTouchUpInside
事件上显示标签

-(IBAction)buttonHit {
    [myDescription setHidden:NO];
}

-(IBAction)buttonReleased {
    [myDescription setHidden:YES];
}

恐怕在Mac上的IB中无法做到这一点,因为在iOS上可能做到这一点:

UIKit和AppKit虽然在许多方面相似,但却是两种截然不同的动物。AppKit的传统可以追溯到20世纪90年代(甚至可能是80年代末),在一些地方(我看着你,NSCell),UIKit的设计在AppKit之上有着20年的经验

虽然您可以很容易地告诉
UIControl
何时调用其操作(并且对于不同的事件可以有不同的操作),
NSControl
仅允许您指定要发送的单个操作

如果您不想覆盖
-[NSButtonCell stopTracking:at:inView:mouseIsUp://code>或
-[NSButton mouseDown://code>和
-[NSButton mouseUp://code>,那么实现所需操作的最简单方法应该是将按钮设置为连续发送其操作。这可以是IB中的骨骼(在“控制”类别下的“属性”检查器中)

下一步是使您的描述层得到支持,并以如下方式重写您的操作方法:

- (IBAction)toggleIt:(id)sender {
    CALayer *descriptionLayer = [myDescription layer];
    [descriptionLayer setHidden:NO]; // (ab-)use implicit animation
    [descriptionlayer performSelector:@selector(setHidden:) withObject:@"" afterDelay:.1];
}
工作原理:


CALayer的“隐藏”属性是可设置动画的,因此,更改它将导致隐式动画。由于目标C只是C,任何不是
0x0
的东西都被解释为
YES
,这就是第三行的位置:空字符串显然不是
0x0
,因此在该操作返回后不久,该层将被调用以隐藏。但是,由于CATTransitions是逐渐发生的,并且可以在中途更新,因此只有当动作不再触发时(即不再按下按钮),才会影响图层的可见性。

有没有一种不用定时器的方法?我不明白为什么我想延迟我的代码-当按钮按下时,隐藏文本字段。发布后,再次显示它。看起来很容易,而且不需要计时器?@Zakman 411:我想我误解了你最初的问题。我已经更新了我的回复。我明白了-我将如何在Interface Builder中实现buttonHit和ButtonRelease?我不知道每次IBAction都要拖什么?@Zakman411你不能。不幸的是,FAIB所描述的只适用于iOS。也许Lion会纠正这种情况,但在此之前,您需要子类
NSButton(Cell)?
或调用一些黑客行为。