NOTE: Although this specific Bug Bite is about NSTextView
, and the “hidden” property, the same underlying issue applies to other interface-objects (NSTableView
, etc.), and different properties, like size.
Problem
If you send a setHidden:YES
message to an NSTextView
, and it’s text disappears, but the view itself (white box) stays visible here’s the problem, and the solution.
It turns out that if you created the NSTextView
by dragging it off the pallet in Interface Builder, then it’s not an NSTextView
. It’s an NSTextView
wrapped inside an NSClipView
inside an NSScrollView
. The NSScrollView
is what puts up the scroll-bars if the NSTextView
gets really big; the NSClipView
helps make the scrolling work.
So if text
is your IBOutlet
to your NSTextView
, then when you say [text setHidden:YES];
, the NSTextView
is hidden, but the the total package won’t disappear, unless you hide the NSScrollView
as well.
Solutions
You can send the message to NSScrollView
containing text
, like so:
[[text enclosingScrollView] setHidden:YES];
.
This will hide everything inside the NSScrollView
, including text
.
Another solution is to create just an NSTextView
in Interface Builder. To do this, put an NSView
in your interface (it’s called a “Custom View”,in the Interface Builder objects pallet). Then select it, bring up the object inspector (cmd-shift-i), choose the “custom class” from the category menu at the top, and select NSTextView
from the list of subclasses. This puts an NSTextView
in your interface, without the surrounding clip and scroll views. Unfortunately, it also means you can’t configure it in Interface Builder, beyond resizing it. That’s why I’m not partial to this approach, although I have used it.
Thanks to ZachR for suggesting enclosingScrollView
.
There’s also -[NSView enclosingScrollView] as an alternative to superview/superview
Comment by ZachR — May 26, 2008 @ 11:28 am