-setNeedsDisplay: applies only to the view to which it is sent. If you need to redraw other views, you need to add some code to send -setNeedsDisplay: to them, too. That's all there is to it.
This is effectively for performance, you wouldn't always necessarily want all subViews to redraw.
If you do want to redraw all subViews, you can use this piece of code: