Maybe the button is outside the bounds of its containing view? If clipsToBounds isn't set, the button will still appear, but since it is outside the bounds of its superview it won't respond to touches.
Another possibility is that another view is overlapping the button. If the overlapping view has a transparent background, you won't be able to see where it overlaps but it could be stealing touch events from the view beneath it.
Any time I have a lot of nested views, I find the easiest way to see what's going on is to (temporarily) set the backgroundColor of each view to a different color. That way I can see exactly where the bounds of each view are, how they are nested, and what overlaps what.