4th option, attach your own script that handles it.
We have used a script called UIScreen, which has a virtual method called "Show()", which handles everything that needs to be activated/deactivated when it needs to.
Then you just call myScreen.Show() and it will activate itself and so on. This does mean that it will have to have references to everything that it needs to activate of course, but if you structure it nicely, you can have things that always are on in a certain parent and dynamic things somewhere else, so you can use the NGUITools.SetActive on static things ( or "always on" things).