可可 – NSButtonCell内定制NSCell

可可 – NSButtonCell内定制NSCell,第1张

概述在我的可可应用程序中,我需要一个NSTableView的自定义NSCell.此NSCell子类包含用于处理单击的自定义NSButtonCell(和两个或三个NSTextFieldCells用于文本内容).您可以在下面找到我的代码的简化示例. @implementation TheCustomCell- (void)drawWithFrame:(NSRect)cellFrame inView:( 在我的可可应用程序中,我需要一个NStableVIEw的自定义NSCell.此NSCell子类包含用于处理单击的自定义NSbuttonCell(和两个或三个NSTextFIEldCells用于文本内容).您可以在下面找到我的代码的简化示例.

@implementation TheCustomCell- (voID)drawWithFrame:(NSRect)cellFrame inVIEw:(NSVIEw *)controlVIEw {   // varIoUs NSTextFIEldCells   NSTextFIEldCell *TitleCell = [[NSTextFIEldCell alloc] init];   ....   // my custom NSbuttonCell   MybuttonCell *warningCell = [[MybuttonCell alloc] init];   [warningCell setTarget:self];   [warningCell setAction:@selector(testbutton:)];   [warningCell drawWithFrame:buttonRect inVIEw:controlVIEw];}

我遇到的问题是:在这个NSCell内部的button(更确切地说:NSbuttonCell)能够正常工作的最佳/正确的方法是什么? “工作”表示:触发分配的动作消息,并在点击时显示备用图像.开箱即用,该按钮在单击时不执行任何 *** 作.

关于这个主题的信息/阅读很难找到.我在网上找到的唯一的职位指出我要实施

- (BOol)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofVIEw:(NSVIEw *)controlVIEw untilMouseUp:(BOol)untilMouseUp;

这是正确的做法吗?实现trackMouse:在我的NSCell中?然后将事件转发到NSbuttonCell?我会期望NSbuttonCell本身知道当它被点击时该怎么办(我看到trackMouse:更多的方法更真实地跟踪鼠标移动 – 而不是作为“标准”点击行为的训练轮).但是,当它包含在一个单元格本身时,它似乎不会这样做
似乎我没有把握自定义单元格的大图,但是

如果有人可以从自己的经验中回答这个问题(或指点某些教程等),我会很高兴,并告诉我,如果我在正确的轨道上.

提前致谢,
托比

解决方法 最低要求是:

>在鼠标向下按钮之后,只要鼠标悬停就必须按下.
>如果鼠标然后释放按钮,您的单元格必须发送相应的动作消息.

要使按钮看起来按压,您需要根据需要更新按钮单元格的突出显示的属性.单独改变状态将不会达到这一目的,但是如果只有,如果它的状态是NSOnState,你想要的是按钮被突出显示.

要发送动作消息,您需要注意鼠标何时释放,然后使用 – [NSApplication sendAction:to:from:]发送消息.

为了能够发送这些消息,您需要参考NSCell提供的事件跟踪方法.请注意,除最终的-stopTracking:…方法之外,所有这些跟踪方法都返回一个布尔值来回答“您要继续接收跟踪消息吗?”的问题.

最后的扭曲是,为了发送任何跟踪消息,您需要实现-hitTestForEvent:inRect:ofVIEw:并返回适当的位元素NSCellHit …值.具体来说,如果返回的值没有NSCellHitTrackableArea值,则不会得到任何跟踪消息!

所以,在高层次上,你的实现将如下所示:

- (NSUInteger)hitTestForEvent:(NSEvent *)event                       inRect:(NSRect)cellFrame                       ofVIEw:(NSVIEw *)controlVIEw {    NSUInteger hitType = [super hitTestForEvent:event inRect:cellFrame ofVIEw:controlVIEw];    NSPoint location = [event locationInWindow];    location = [controlVIEw convertPointFromBase:location];    // get the button cell's |buttonRect|,then    if (NSMouseInRect(location,buttonRect,[controlVIEw isFlipped])) {        // We are only sent tracking messages for trackable areas.        hitType |= NSCellHitTrackableArea;    }    return hitType;}+ (BOol)prefersTrackingUntilMouseUp {   // you want a single,long tracking "session" from mouse down till up   return YES;}- (BOol)startTrackingAt:(NSPoint)startPoint inVIEw:(NSVIEw *)controlVIEw {   // use NSMouseInRect and [controlVIEw isFlipped] to test whether |startPoint| is on the button   // if so,highlight the button   return YES;  // keep tracking}- (BOol)continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint inVIEw:(NSVIEw *)controlVIEw {   // if |currentPoint| is in the button,highlight it   // otherwise,unhighlight it   return YES;  // keep on tracking}- (voID)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inVIEw:(NSVIEw *)controlVIEw mouseIsUp:(BOol)flag {   // if |flag| and mouse in button's rect,then   [[NSApplication sharedApplication] sendAction:self.action to:self.target from:controlVIEw];   // and,finally,[buttonCell setHighlighted:NO];}
总结

以上是内存溢出为你收集整理的可可 – NSButtonCell内定制NSCell全部内容,希望文章能够帮你解决可可 – NSButtonCell内定制NSCell所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1018380.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存