• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Erratic behaviour in mouseDown: method of NSTableView
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Erratic behaviour in mouseDown: method of NSTableView


  • Subject: Erratic behaviour in mouseDown: method of NSTableView
  • From: Greg Hurrell <email@hidden>
  • Date: Tue, 26 Apr 2005 20:49:20 +0200

I have a table view that uses custom subclasses of NSTableView, NSTableColumn and various NSCell subclasses. I have noticed that the performance of the table view is quite sluggish and that it seems to miss mouse clicks at times. This is not a problem that is unique to my custom table view but something that you can see in any Cocoa application that uses table views; try clicking rapidly on a checkbox or similar control inside such a table view and you'll see that some of the clicks get missed (for example, I'm writing this in Mail.app; try checking and unchecking in the "Rules" section of the preferences and you'll see what I mean). I don't see the problem in Carbon apps (for example, checking and unchecking songs in iTunes).

So I came up with a minimal test case which does basically nothing more than add NSLog statements in this method of the NSTableView subclass:

- (void)mouseDown:(NSEvent *)theEvent

And this method of the NSCell subclasses:

- (BOOL)trackMouse:(NSEvent *)theEvent
            inRect:(NSRect)cellFrame
            ofView:(NSView *)controlView
      untilMouseUp:(BOOL)untilMouseUp

What I notice is that the table view always receives the mouse down event no matter how fast you click, but that if you click rapidly it will only call the mouse tracking method in the cell some of the times (you don't have to click very fast to get this to happen).

I had a very quick attempt at replacing the mouseDown: method (ie. not calling the super implementation but doing everything on my own) but I don't think it's a path worth going down as I'll have to do an awful lot to replicate the Cocoa behaviour. What I do know from my own investigations and from reading the archives is that NSTableView is setting up a modal even loop inside mouseDown: and eats up all the events up to and including the finally mouse-up event, and along the way it is handling things like selection behaviour, determining which cells need to be set up for each row, copying cells before passing them the trackMouse:inRect:ofView:untilMouseUp: message, releasing the cells. It's also modifying its behaviour depending on the class of the cell in question (for example, it sets untilMouseUp to NO in the case of NSButtonCells and YES in the case of NSStepperCells). I suspect it is doing an awful lot more under the hood in addition to all this too.

Basically, it's probably too much of a reverse engineering task to bother with, and even if I could exactly match Cocoa's behaviour I might not eliminate the problem of the missed clicks. Given that the problem exists even in Apple's flagship Cocoa apps (like Mail.app) it's likely that there are no easy fixes, because if there were Apple would have fixed it already.

Any thoughts?

Cheers,
Greg
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Prev by Date: Re: NSFileModificationDate after 2039
  • Next by Date: Re: A Question about [[self superview] doSomething]
  • Previous by thread: Re: How can a view know when its superview changes sizes?
  • Next by thread: Trouble drawing a polygon...
  • Index(es):
    • Date
    • Thread